我想寫一組類D_I(又名I = 1,2,...只是我的意思是'_I'是類專有名稱,而不是整數)它處理一些(布爾,例如)操作F對於所有的類都有相同的含義。但是我也想用這些類的對象的「和」來操作,這個組的不同類別可能會被「添加」在一起。提到這種對象總和的操作取決於添加對象的相應操作。C++運算符代碼繼承問題:我是否需要爲所有派生類複製相同的代碼?
這就是爲什麼我要創造共同的基B類來處理的操作「總結」:
class B
{public:
B(): LEFT(NULL), RIGHT(NULL) {};
B (const SpBrd& S);
B (const B& A, const B B);
~B();
{if (LEFT != NULL) delete LEFT; // NULL if it is default B or D_I
if (RIGHT != NULL) delete RIGHT; // NULL if it is default B or D_I
}
B operator + (const B& S) const;
bool F(const Point& P) const;
{bool b = aF(P);
if (LEFT != NULL) b = b && LEFT->F(P); // this is how F depends
if (RIGHT != NULL) b = b && RIGHT->F(P); // of added classes
}
protected:
virtual bool aF(const Point& P) const {return true;}; // Default!
B* LEFT; // Pointer to left operand of "sum"
B* RIGHT; // Pointer to right operand of "sum"
// (since it might point to D_i class too as well)
};
所以這種方法得出的d類是容易寫,因爲它只能處理它的構造和AF :
class D_I: public B
{public:
D() {...};
protected:
virtual bool aF (const Point& P) const
{// return something here
}
};
的問題是:如何編寫操作+和複製B類的構造函數:
B:B (const B& S)
{if (S.LEFT != NULL) LEFT = new B (S.LEFT)
if (S.RIGHT != NULL) RIGHT = new B (S.RIGHT)
};
B B:operator + (const B& S) const
{SpBrd S;
S.LEFT = new B (*this);
S.RIGHT = new B (S);
};
將不會產生正確的結果,因爲如果'運算符+'或'S.LEFT'或'S'中的'this','S'應該被替換爲相應的'新D_I ...'複製構造函數中的.RIGHT不是指類B的對象,而是指類D_I中的一個對象。
所以,我無法找到一種方法讓B :: operator +知道總和的類型來源,因爲可能會有大量的D_I,並且它們會不時添加。我該怎麼做才能正確寫出這一切?
對於所有的(D_I,D_J)對,我無法編寫D_I運算符+(D_J)和D_I :: D_I(常量D_J)的語句,這是不公平的! (這將代表空間中的邊界(表面),函數F代表在邊界內 - 即檢查點是否在空間體內,但是我想操作的邊界內部的體可能是交叉的例如:兩個球體邊界相交 - 內部和外部區域 - 產生球形外殼aka 3D環;也可能需要查看半徑爲R,立體角爲10 *的相交球面邊界,圍繞杆等10度)
藉口StackOverflow不尊重我的分段符,但是不安全: 什麼是'SpBrd'? 運算符+在底部沒有語法意義。 'B類'甚至不會在我的腦海裏編譯,因爲它的ctors和dtor的名字是錯誤的。 另外,考慮改寫你的問題。目前還不清楚: 「Group class」? 避免被動語態。 無論我如何閱讀它,「1)在運算符+如果*這和S不是B,但D_I應該是'新D_I'之一,甚至沒有讀到我像一個適當的英文句子。點2的同上)。 我會在這裏停下來。 – wilhelmtell 2010-01-13 16:57:37
哦,我的上帝,我非常抱歉...提出這個問題,我只是通過刪除額外的函數來刪除額外的函數,並將類名如SpBrd和SphBrd更改爲Base和Derive(簡稱B和D)不要混淆讀者,但它變得相反...... 另外我已經解釋了該段落。再次抱歉。 – Nick 2010-01-13 17:17:22
我更新了我的答案。我認爲它回答了你現在要問的問題,儘管我仍然對此感到困惑。 – Omnifarious 2010-01-13 22:35:13