我有一个包含POD成员的类。我需要复制所有成员,除了一个(示例中的成员a)。我现在这样做的方式如下:
class Example
{
private:
int a = 0;
int b = 0;
int c = 0;
int d = 0;
double e = 0;
public:
Example& operator=(const Example &rhs)
{
b = rhs.b;
c = rhs.c;
d = rhs.d;
e = rhs.e;
return *this;
}
Example() {};
Example(const Example& toCopy)
{
*this = toCopy;
}
};
有没有办法将变量标记为不复制,因为这样做很冗长,如果我以后修改这个类就容易出错?
答案 0 :(得分:3)
你可以在结构中包装“奇怪的人”a
,并分别定义结构行为:
class Example
{
private:
CopyLess a;
int b = 0;
int c = 0;
int d = 0;
double e = 0;
struct CopyLess {
int a = 0;
CopyLess& operator=(const CopyLess&) { return *this; }
CopyLess(const CopyLess&) {}
};
};
请注意,我不再为Example
编写任何特殊成员了,因为默认设置符合您的要求。以这种方式编写代码以避免尽可能多地编写特殊成员称为“零度规则”,更多信息和示例:http://www.nirfriedman.com/2015/06/27/cpp-rule-of-zero/。
答案 1 :(得分:0)
不,您无法使隐式复制分配跳过成员。正如您所做的那样定义自定义赋值运算符是实现所需行为的方法。
如果我稍后修改这个类
,这样做是冗长的,容易出错
您可以将复制的成员分组到单个子对象中。这样,自定义副本分配对于更改并不脆弱,并且详细程度与复制成员的数量保持不变。
奖励:您不需要单独为成员指定值初始化,但是整个子对象的值初始化就足够了。
class Example
{
int a = 0;
struct {
int b;
int c;
int d;
double e;
} state = {};
public:
Example& operator=(const Example &rhs)
{
state = rhs.state;
return *this;
}
...
由于成员是私有的,因此不会更改该类的现有API。