2014-06-22 118 views
0

我有一個類class1及其構造函數class1(int i)和複製構造函數class1(const class1& other)C++指針指向的類的副本的動態分配

class1的實例是動態創建的,因爲在編譯時int參數是未知的。

我的問題是,我必須通過生產對象和消費對象之間的指針:

void producer::produceAndSend(...) { 
    class1 *c1 = generate(...); 
    consumerObj.set(c1); 
} 

class consumer { 
    class1 *internalC; 
    void set(class1 *c); 
} 

void consumer::set(class1 *c) { 
    this->internalC = c; //This only copies the pointer, not the content 
} 

我想存儲由c1所指向的對象的副本,此副本必須指出internalC。 我該如何做到這一點?

+2

你可以做'internalC = new class1(* c)'。 – 0x499602D2

+0

這會導致錯誤:無法將'class1 **'轉換爲'作業中的'class1 *' –

+0

您是否可以發佈已更新的'consumer :: set'實現,因爲我認爲0x49 ...建議看起來正確。 – ilent2

回答

6

Instances of class1 are created dynamically, since the int argument is not known at compile time.

這不是動態分配的目的。您可以使用運行時參數創建具有自動存儲持續時間的對象。實際上,通過不使用動態分配,您的問題會自動解決,並且不會涉及您泄漏內存。

void producer::produceAndSend(...) { 
    class1 c1 = generate(...); 
    consumerObj.set(c1); 
} 

class consumer { 
    class1 internalC; 
    void set(class1 c); 
} 

void consumer::set(class1 c) { 
    this->internalC = c; //This only copies the pointer, not the content 
} 
+0

正如我所說的,'class1'的構造函數是'class1(int i)'。你寫的東西無法工作。 –

+0

@ the_candyman,是的,它可以。容易。請再次閱讀您書中的相關部分。 – chris

+1

@the_candyman出於什麼原因?因爲'consumer'會默認構造'internalC'?那麼你有一些選擇。第一個是給class1一個默認的構造函數,第二個是給'consumer'一個構造函數,它通過傳遞一個int來構造'internalC',第三個選項是使用boost :: optional內部函數。 '如果你想要的是'internalC'在設置之前不存在。 –