我发现自己经常做的一件事就是制作“几乎默认的”复制构造函数和赋值操作符。也就是说,我发现自己处于这样的情况:编译器提供的复制和赋值操作符对大多数数据成员都有效,但有一个特定的数据成员需要进行不同的处理。这意味着我必须显式地创建一个复制构造函数/赋值操作符,包括显式地列出所有具有简单复制语义的数据成员。对于有相当数量的数据成员的类,或者稍后添加成员变量但没有添加到复制构造函数/赋值操作符中时,这可能会令人恼火。
有没有办法告诉C++编译器,显式声明的复制构造函数/赋值运算符应该像隐式构造函数/赋值运算符一样工作,除了之后运行的一些额外代码?(这种语法是否与C++98兼容,或者是否需要C++11或C++14支持?)
发布于 2014-07-12 08:22:14
如果你能像Igor Tandetnik建议的那样,将特定的处理隔离在一个合适的RAII包装器中:那就去做吧。
如果您仍然需要在复制构造函数和/或赋值运算符中进行特定处理(例如在容器或日志中注册对象创建/赋值),您可以将可以作为默认副本构造/赋值的数据成员分组到一个单独的类中,该类用作基类或数据成员,并作为复合类进行处理,例如:
struct x_base {
int a,b,c,d;
std::string name;
};
struct x : x_base {
x(const x& other)
: x_base(other)
{
descr = "copied ";
descr += name;
descr += " at ";
descr += CurrentTimeAsString();
std::cout << descr << "\n";
}
void operator = (const x& other)
{
x_base::operator =(other);
descr = "assigned ";
descr += name;
descr += " at ";
descr += CurrentTimeAsString();
std::cout << descr << "\n";
}
std::string descr;
};以后添加不需要特定处理的数据成员时,只需将它们添加到x_base即可。
https://stackoverflow.com/questions/24708101
复制相似问题