2012-03-01 87 views
1

我有2類:複製從一個指針中的內容複製到另一個

class Request 
    { 
     KeyValuePair* dimension; 
    }; 

    class Response 
    { 
     KeyValuePair* dimension; 
    }; 

    class KeyValuePair 
    { 
     public: 
     hash_map<string, string> hmap; 
    }; 

的方法之一,我想填充Response.dimensionRequest.dimension,但我想Request.dimensionResponse.dimension指向不同的地址?

我不想要任何改變Response.dimension這也影響Request.dimension

有沒有辦法做到這一點?

void Transformation::applyTransformations(const Request& req, Response& res) 
{ 
    res.dimension = req.dimension; // WRONG. Pointing the same address. 
} 
+0

如何定義「KeyValuePair」?它是否有合適的(複製)構造函數? – 2012-03-01 09:43:39

+0

如果你有正確定義的拷貝構造函數,你可以執行'res.dimension = new KeyValuePair(req.dimension);'。 – jogojapan 2012-03-01 09:43:42

回答

2

是的,當然:

*(res.dimension) = *(req.dimension); 

注意,如果KeyValuePair不是一個POD類型,你應該定義賦值運算符(operator =),因爲它會在分配過程中被調用。如果你不這樣做,編譯器生成的將被調用。

您也應該檢查是否res.dimension被正確分配,如果沒有,使用拷貝構造函數:

if (res.dimension) 
    *(res.dimension) = *(req.dimension); 
else 
    res.dimension = new KeyValuePair(*(req.dimension)); 
+2

這假設存儲已經分配給'*(res.dimension)',這可能不是 – 2012-03-01 09:45:15

+0

@PaulR你是對的,我編輯了我的答案。 – 2012-03-01 09:47:35

+0

對不起。什麼是POD?我已經更新,把我的KeyValuePair的問題。如果讓KeyValuePair不是POD,你能告訴我一個教程來定義賦值運算符嗎?謝謝! – Rudy 2012-03-01 09:58:27

1

可以重載=運營商的Response類的執行request.dimension的深層副本,這將使您的Response.dimension具有與Request.dimension相同的值,但將獨立於對Request.dimension的任何更改。

+0

當然,他必須記得在分配時取消引用指針。 – 2012-03-01 09:55:33

0
+0

默認構造函數 – 2012-03-01 09:44:57

+0

這真的不是一個有用的答案。應該*幾乎總是*不僅僅是一個鏈接。 – 2012-03-01 09:52:46

+0

[其中很多](https://www.google.com/search?q=c%2B%2B+copy+constructor&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:es-ES:official&client =火狐-a)的 – m0skit0 2012-03-01 10:33:33

0

您需要分配新的內存。你也需要有複製構造函數(或者使用默認的構造函數)。你

res.dimension = new KeyValuePair(req.dimension);

還必須處理內存,即定義一個拷貝構造函數,拷貝操作,空的構造函數和析構函數。

相關問題