有很多的東西錯這個代碼:
- 作爲KennyTM筆記,連字符是在錯誤的地方。
- 您正在傳遞一個B *到一個需要B &的函數,它們在C++中不一樣
- 您的php片段中顯示的設計似乎設計錯誤。雖然你正在做的事情是你可能想要做的事情,但你通常會想使用一個構造函數,而不是C++和PHP。
- 你直接把代碼中的文件,這是不是在C++允許,把它的主要功能,而不是
- 內存管理:您正在使用
new
沒有delete
(或智能指針類)
- 你使用B類A類,而A類不知道關於B類(它是後面定義) - 你應該穿上頂級B(或者可能使用前聲明)
幾個方法讓你的代碼正常工作如下所示。
include <memory>
using std::auto_ptr;
class B
{
}
class A
{
public:
A();
SetB(B& b);
private:
B b1; // a B made in the constructor
B b2; // a COPY of the original B you make
}
A::A()
: b1(/*whatever you want to pass to B's constructor*/)
{
}
A::SetB(B& b)
{
b2 = b;
}
int main(int agrc, char** argv)
{
A firstA();
B firstB();
firstA.SetB(firstB);
A* secondA = new A();
B* secondB = new B();
secondA->SetB(*secondB);
auto_ptr<A> thirdA(new A());
auto_ptr<B> thirdB(new B());
thirdA->SetB(*thirdB);
// whatever other code
delete secondA;
delete secondB;
}
注意ID調用SETB只有一次(而且是與你所創建的不同對象之間的循環depndencies沒問題),但你做希望類的外部構造B的靈活性,可以改爲構造函數的參數。
另外請注意,你正在製作一個你在main中創建的B的副本 - 如果你想在類中使用傳入副本(就像你在PHP中一樣),你應該使用成員引用(在這種情況下,你將需要設置它在構造函數中引用的內容,但在SetB函數中不能這樣做。
然後,請注意,secondA,secondB方法存在嚴重問題,因此不建議但是,沒有什麼會出錯的,但是,這樣很容易獲得泄漏內存的代碼(並且很難找出泄漏的位置),並且最重要的是,當您要使用異常時,您需要異常安全代碼,這是不能達到使用普通的舊的指針。
最後,請注意你在這裏混搭。例如,一起使用firstA和thirdB沒有任何問題。
你有[一個很好的入門C++的書?(http://stackoverflow.com/questions/388242/the-definitive-c++-book-guide-and-list)PHP和C++是真的沒有什麼相似和不一本好書,你會發現它很難(最好)學會編寫好的,正確的C++代碼。 – 2010-09-12 19:40:26
你絕對需要一本好書或C++的這種學習材料。特別是您需要了解C++如何處理指針,引用和對象實例。大多數解釋型語言使這些細節無關緊要,或者在大多數時候以其他方式管理它們,但在C++中,這些概念恰到好處。 – TheUndeadFish 2010-09-12 22:05:51
@詹姆斯:我寧願說,如果沒有一本好書,他永遠不會寫出好的C++代碼,只是將一些代碼行放在一起。我還想補充說,自己學習是非常困難的,如果他有一個導師(一個好的......)來解釋事情,那將是最好的。當然SO可以幫助太:) – 2010-09-13 08:36:24