与对象创建父/子关系

时间:2011-09-20 22:32:24

标签: c++

好的,所以我在创建父/子关系方面遇到了一些麻烦。我可以解释这个问题的最简单方法是使用一个对象,使用相同类型的另一个对象的引用(或指针),然后是一个子引用(或指针)更多对象的数组。该对象应具有.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'

2 个答案:

答案 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*>&