我有2个课程:
class Request
{
KeyValuePair* dimension;
};
class Response
{
KeyValuePair* dimension;
};
class KeyValuePair
{
public:
hash_map<string, string> hmap;
};
在其中一种方法中,我想用Response.dimension
填充Request.dimension
,但我希望Request.dimension
指向与Response.dimension
不同的地址?
我不希望任何更改Response.dimension
也会影响Request.dimension
。
有办法吗?
void Transformation::applyTransformations(const Request& req, Response& res)
{
res.dimension = req.dimension; // WRONG. Pointing the same address.
}
答案 0 :(得分:2)
是的,当然:
*(res.dimension) = *(req.dimension);
请注意,如果KeyValuePair
不是POD类型,则应定义赋值运算符(operator =
),因为它将在赋值期间调用。如果不这样做,将调用编译器生成的。
您还应检查res.dimension
是否已正确分配,如果没有,请使用复制构造函数:
if ( res.dimension )
*(res.dimension) = *(req.dimension);
else
res.dimension = new KeyValuePair(*(req.dimension));
答案 1 :(得分:1)
您可以重载=
班级的Response
运算符以执行request.dimension
的深层副本,这会使您的Response.dimension
具有与Request.dimension
相同的值{1}}但它将独立于对Request.dimension
的任何更改。
答案 2 :(得分:0)
答案 3 :(得分:0)
您需要分配新内存。您还需要具有复制构造函数(或者在适当时使用默认构造函数)。
res.dimension = new KeyValuePair(req.dimension);
此外,您还必须处理内存,即定义复制构造函数,复制运算符,空构造函数和析构函数。
答案 4 :(得分:0)
您可以实现'copy on write'指针,以避免不必要的开销。