2013-01-09 47 views
1

我有兩個指針類全局聲明調用C++中的拷貝構造函數

A* a; 
A* b; 

int main(){ 
    a = new A(...);   
} 

我應該如何調用拷貝構造函數使得B複印BY的值。類A沒有任何指針作爲字段。

我有一個構造函數聲明,但我可以刪除它,以便不覆蓋默認的。

感謝

+0

你爲什麼把[tag:linux]放在這裏? – Griwes

回答

2

只需調用拷貝構造函數與新:

b = new A(*a); 

我要問,雖然...爲什麼不保留兩個靜態的對象呢?

+0

得到我的投票。因爲你回答了簡單的問題,沒有不必要的混亂。 – Peter

+2

@Peter,我真的很喜歡你的評論。所以,現在,當有人問到什麼時,我們應該回答他的問題,即使他正在採取一種完全錯誤和愚蠢的方式? *那是愚蠢的。 – Griwes

+0

@Griwes,是的,沒有。我同意我們應該提出一些指導性問題,讓OP考慮他的設計並探索更好的選擇。但是這些問題有時會隱藏在很長的答案中。這幾乎是一種自然的反應。 – StoryTeller

0

如果你不聲明一個,你總會得到一個隱含的構造函數,複製構造函數和析構函數,你可以像StoryTeller那樣調用它;

b = new A(*a); 

如果你想在你需要寫一個拷貝構造函數做任何事情,這裏有一些關於如何做到這一點:http://www.cplusplus.com/articles/y8hv0pDG/

+1

http://jcatki.no-ip.org/fncpp/cplusplus.com – Griwes

+0

啊,沒有看到那一個。謝謝 :) – dutt

4

有兩件事情你的代碼錯誤,需要進行在回答問題之前修復。

  1. 事實上,這些全球性的指針是全局的 - 有一些全球性的,在全局命名空間,是不好的設計標誌(如果你的老師是崇尚它 - 因爲它看起來有點像功課 - 然後打他一巴掌在臉上這樣做)。
  2. 事實上,這些全局指針是原始指針 - 您要麼將所有權保留在原來的位置,並且不要將所有權放在一邊 - 那麼您將使用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); 

所以只是取消引用指針得到AA *。但是,請不要這樣做 - 即使在獨立環境中,您也可以輕鬆實現自己的智能指針,以便以合理的方式進行包裝。