我有兩個指針類全局聲明調用C++中的拷貝構造函數
A* a;
A* b;
int main(){
a = new A(...);
}
我應該如何調用拷貝構造函數使得B複印BY的值。類A沒有任何指針作爲字段。
我有一個構造函數聲明,但我可以刪除它,以便不覆蓋默認的。
感謝
我有兩個指針類全局聲明調用C++中的拷貝構造函數
A* a;
A* b;
int main(){
a = new A(...);
}
我應該如何調用拷貝構造函數使得B複印BY的值。類A沒有任何指針作爲字段。
我有一個構造函數聲明,但我可以刪除它,以便不覆蓋默認的。
感謝
只需調用拷貝構造函數與新:
b = new A(*a);
我要問,雖然...爲什麼不保留兩個靜態的對象呢?
得到我的投票。因爲你回答了簡單的問題,沒有不必要的混亂。 – Peter
@Peter,我真的很喜歡你的評論。所以,現在,當有人問到什麼時,我們應該回答他的問題,即使他正在採取一種完全錯誤和愚蠢的方式? *那是愚蠢的。 – Griwes
@Griwes,是的,沒有。我同意我們應該提出一些指導性問題,讓OP考慮他的設計並探索更好的選擇。但是這些問題有時會隱藏在很長的答案中。這幾乎是一種自然的反應。 – StoryTeller
如果你不聲明一個,你總會得到一個隱含的構造函數,複製構造函數和析構函數,你可以像StoryTeller那樣調用它;
b = new A(*a);
如果你想在你需要寫一個拷貝構造函數做任何事情,這裏有一些關於如何做到這一點:http://www.cplusplus.com/articles/y8hv0pDG/
有兩件事情你的代碼錯誤,需要進行在回答問題之前修復。
unique_ptr
或者僅僅是普通對象(除非對象應該活得更長比main()
,但這是一個奇怪的情況)。因此,修正後的代碼,它看起來像這樣:
int main()
{
A a;
A b(a);
}
如果您需要訪問從代碼的其他部分的那些對象,沒有明確地傳遞他們身邊,把他們在理智命名namespace
:
// in header
namespace a_and_b // this is *wrong* name for it, of course
{
extern A a;
extern A b;
}
// in one of TUs - also possible to wrap this in namespace ... { ... }
A a_and_b::a;
A a_and_b::b(a_and_b::a);
當然,如果你只是問了語法,答案應該是:
A * b = new A(*a);
所以只是取消引用指針得到A
出A *
。但是,請不要這樣做 - 即使在獨立環境中,您也可以輕鬆實現自己的智能指針,以便以合理的方式進行包裝。
你爲什麼把[tag:linux]放在這裏? – Griwes