好的,所以我在创建父/子关系方面遇到了一些麻烦。我可以解释这个问题的最简单方法是使用一个对象,使用相同类型的另一个对象的引用(或指针),然后是一个子引用(或指针)更多对象的数组。该对象应具有.getChildren,.addChild,.removeChild,.getParent,.changeParent等函数。 我有一个可怕的时间与指针,如果有人可以帮助代码那将是伟大的。 此外,如果有人好奇,我将使用这种方法与3D模型。基础模型(父母)将是对象的中心,所有孩子都可以自由移动,当父母移动时,它会让孩子移动。
代码:
class Base {
protected:
Base* parent;
std::vector<Base*> children;
std::string id;
POINT pos, rot;
public:
Base (void);
Base (std::string);
Base (POINT, POINT, std::string);
Base (const Base&);
~Base (void);
POINT getPos (void);
POINT getRot (void);
Base getParent (void);
Base getChildren (void);
void addChild (Base&);
void removeChild (Base&);
void changeParent (Base);
void move (int, int);
void rotate (int, int);
void collide (Base);
void render (void);
};
Base::Base (void) {
this->id = getRandomId();
this->pos.x = 0; this->pos.y = 0; this->pos.z = 0;
this->rot.x = 0; this->rot.y = 0; this->rot.z = 0;
};
Base::Base (std::string str) {
this->id = str;
this->pos.x = 0; this->pos.y = 0; this->pos.z = 0;
this->rot.x = 0; this->rot.y = 0; this->rot.z = 0;
};
Base::Base (POINT p, POINT r, std::string str) {
this->id = str;
this->pos = p;
this->rot = r;
};
Base::Base (const Base& tocopy) {
this->parent = tocopy.parent;
this->children = tocopy.children;
this->id = tocopy.id;
this->pos = tocopy.pos;
this->rot = tocopy.rot;
};
Base::~Base (void) {
};
void Base::changeParent (Base child) {
*(this->parent) = child;
};
int main (void) {
POINT p;
p.x=0;p.y=0;p.z=3;
Base A;
Base B(p, p, "Unique");
printf("A.pos.z is %d and B.pos.z is %d\n", A.getPos().z, B.getPos().z);
B.changeParent(A);
printf("B.parent.pos.z %d should equal 0\n", B.parent->getPos().z);
我得到的代码错误是:错误C2248:'Base :: parent':无法访问类'Base'中声明的受保护成员 此外,如果我将所有内容公开,它将编译正常,但它会在运行时崩溃。
注意:我没有复制所有代码,只是我认为相关的代码。
编辑:完全转储错误:
(152) : error C2248: 'Base::parent' : cannot access protected member declared in class 'Base'
(20) : see declaration of 'Base::parent'
(18) : see declaration of 'Base'
答案 0 :(得分:0)
此
printf("B.parent.pos.z %d should equal 0\n", B.parent->getPos()
由于这个,引发了你的错误
protected:
Base* parent;
您尝试从类实现之外引用B.parent
。由于parent
被声明为protected
,因此无法使用Base
。在public:
inline Base* getParent() { return parent; }
的声明中,您应该添加一个返回父级并且是公共的访问者函数,例如:
{{1}}
答案 1 :(得分:0)
如果您告诉我们哪一行有错误,这总是有帮助的。如果你提到这就是这一行,你现在有10个答案。
printf("B.parent.pos.z %d should equal 0\n", B.parent->getPos().z);
int main()
无法访问Base
的受保护成员,因此无法访问B.parent
。将其替换为:
printf("B.getParent().pos.z %d should equal 0\n", B.getParent()->getPos().z);
http://ideone.com/CobdS另请注意,getParent()
应该返回指针(Base*
),而getChildren()
可能应该返回const std::vector<Base*>&