提问人:BugShotGG 提问时间:2/7/2018 最后编辑:BugShotGG 更新时间:2/9/2018 访问量:940
在复制构造函数中使用 *this 作为 const 来克隆 self [duplicate]
Using *this as const in copy constructor to clone self [duplicate]
问:
我正在尝试实现原型模式。当我传递 self 对象以便使用复制构造函数克隆自身时,由于以下原因,我无法访问 self 成员函数:*this
error: passing ‘const ConcreteClonable1’ as ‘this’ argument discards qualifiers [-fpermissive]
该错误与错误使用 有关。但是,如果我从复制构造函数中删除,一切正常。我想使用复制构造函数,因为它应该使用,带有参数,并且能够访问非常量类成员。const
const
const
代码如下:
/* Prototype base class. */
class Prototype
{
protected:
std::string type;
int value;
public:
virtual Prototype* clone() = 0;
std::string getType() { return type; }
int getValue() { return value; }
};
//clonable class
class ConcreteClonable1 : public Prototype
{
public:
ConcreteClonable1(int number)
{
std::cout << "ConcreteClonable1 cnstr\n";
type = "Type1";
value = number;
}
//compilation error if const is used
ConcreteClonable1 (const ConcreteClonable1& x)
{
std::cout << "ConcreteClonable1 copy cnstr\n";
type = x.getType();
value = x.getValue();
}
Prototype* clone() { return new ConcreteClonable1(*this); }
};
对象在 .Factory
问题是为什么会这样?有没有更好的方法可以使用 c++ STL 中的某种复制函数来做到这一点?
答:
你的正确性无处不在。眼前的问题是,如果隐式指针是 ,则需要标记,否则它们不能使用,在您的情况下是这样。const
getType
getValue
const
this
const
除此之外,您还应该将函数修复为太(尽管这不是您直接编译问题所必需的):clone()
const
Prototype* clone() const { return new ConcreteClonable1(*this); }
毕竟,克隆不应修改当前对象。
评论
mutable
const
std::vector<bool>
bool
class
'c'
char
int
您正在尝试在 的复制构造函数中对 的 const 对象调用非常量成员函数。为了让它工作,你必须让它们保持常量(或者根本不使用它们,见下文)。Prototype
ConcreteClonable1 : public Prototype
ConcreteClonable1
除此之外,你真的不需要知道复制。只需复制成员即可。Prototype
ConcreteClonable1
评论
getType
getValue
const
const
nonconst
只需委托 copy 构造Prototype
ConcreteClonable1::ConcreteClonable1(const ConcreteClonable1 & x) : Prototype(x)
{ std::cout << "ConcreteClonable1 copy cnstr\n"; }
通常,您应该更喜欢成员初始化,而不是在构造函数的主体中分配。
Prototype::Prototype(std::string type_, int value_) : type(type_), value(value_) {}
ConcreteClonable1::ConcreteClonable1(int number) : Prototype("Type1", number)
{ std::cout << "ConcreteClonable1 cnstr\n"; }
评论
: Prototype(x)
getType
getValue
const
Prototype::Prototype(const Prototype &)
getType
getValue
struct pair { std::string first; int second; };
pair one = { "just works", 1 }, two; two = one;
Prototype::Prototype()
ConcreteClonable1
Prototype
ConcreteClonable1
Prototype
评论
getType
const
const
this
const