2011-09-20 107 views
0

好的,所以我在創建父母/子女關係時遇到了一些麻煩。我可以解釋的最簡單方法是使用一個對象,引用(或指針)指向另一個相同類型的對象,然後是一個引用(或指針)到更多對象的數組。該對象應具有.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:「基地::父」:不能訪問類「基地」也宣告 保護的成員,如果我做的一切公開,它會很好的編譯,但是它會在運行時崩潰。

注:我沒有複製所有的代碼,只是我認爲是相關的。

編輯:錯誤的完全轉儲:

(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

錯誤所在,從將有助於未來行。另外,你應該爲你的構造函數使用[初始化列表](http://www.cprogramming.com/tutorial/initialization-lists-c++.html),而不是所有這些東西,它會保存一個副本。 –

+0

與轉儲編輯後。我不太瞭解這些,我剛剛閱讀了不久前的這些內容,所以我現在不擔心它。 – Hondros

+0

另外,我並不認爲自己做錯了什麼,語言是明智的,因爲如果我將「protected」更改爲「public」,但只是在運行時崩潰,它會進行編譯。 – Hondros

回答

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; } 
+0

你知道什麼是有趣的。我實際上已經在我的代碼中定義了這個,並且我忘記了使用。謝謝。編輯:不幸的是,它仍然在開始崩潰。所以,感謝解決一個問題,但我現在應該做什麼? – Hondros

+0

沒有冒犯行爲,但是你使用指針很麻煩,很可能會讓你在一段時間內碰到崩潰和意外的行爲。這裏很難分析所有的問題。然而,下一個最直接的問題是在'changeParent'中的'*(this-> parent)= child'。在這裏,您取消引用了從未初始化的指針(「父」),然後爲其分配一些內容,這幾乎總是會導致崩潰。最小的情況是,你希望'this-> parent =&child'在這裏,但是徹底檢查你的代碼會更好。 – adpalumbo

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

+0

如果你看看編輯,它顯示了行,我已經有了答案。謝謝你。此外,這並不解決我的運行時錯誤,但我只是廢除這個代碼。 – Hondros

+0

是的,那樣做。不幸的是,以這種方式移動點實際上非常緩慢。 –