2012-03-01 84 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);

还必须处理内存,即定义一个拷贝构造函数,拷贝操作,空的构造函数和析构函数。

相关问题