好的,所以我在創建父母/子女關係時遇到了一些麻煩。我可以解釋的最簡單方法是使用一個對象,引用(或指針)指向另一個相同類型的對象,然後是一個引用(或指針)到更多對象的數組。該對象應具有.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'
錯誤所在,從將有助於未來行。另外,你應該爲你的構造函數使用[初始化列表](http://www.cprogramming.com/tutorial/initialization-lists-c++.html),而不是所有這些東西,它會保存一個副本。 –
與轉儲編輯後。我不太瞭解這些,我剛剛閱讀了不久前的這些內容,所以我現在不擔心它。 – Hondros
另外,我並不認爲自己做錯了什麼,語言是明智的,因爲如果我將「protected」更改爲「public」,但只是在運行時崩潰,它會進行編譯。 – Hondros