我正在编写一个类,我不断添加新成员(它是项目的原型),我已经实现了自己的构造函数,复制构造函数,复制操作符等...当我添加更多成员时,我必须提醒自己不断将它们添加到构造函数和运算符中,我想知道是否有自动检查是否包含所有内容的方法。
我实现了一个简单的解决方案,它涉及计算类声明中的所有成员,然后设置一个带有该值的#define。
Class A
{
int a;
int b;
vector<int> c;
/*3 members*/
}
#define CLASS_A_MEMBERS 3
在构造函数中我只是做这样的事情
A::A( )
{
int counter=0;
a=1; counter++;
b=1; counter++;
c.clear(); counter++;
assert(counter==CLASS_A_MEMBERS)
}
大!每当我忘记添加一些东西时,我就会得到一个断言和违规的地方!
好的,这有效......但是,有更优雅的方式做这样的事吗?
干杯
答案 0 :(得分:3)
不要以这种方式解决您的潜在问题。相反,通过使您的类不可复制或平凡(默认)复制/可分配来解决它。如果您的所有资源都由RAII原则管理,那么您可以让编译器为您生成所有特殊构造函数/运算符,无论您对该类执行什么操作,它都会正确生成它们。
答案 1 :(得分:0)
您的代码仍然要求您记住更新CLASS_A_MEMBERS
,并将counter++
添加到初始化程序和复制构造函数中。
更好的解决方案是编写单元测试,这是一个更强大的解决方案,因为您可以使用它来测试各种行为。
无法自动解决此问题。将成员添加到类时,您必须访问所有构造函数等,以确保它们是正确的。文本搜索可以找到最后一个成员被提及的所有地方,这将是您添加新成员时可能需要触摸的所有地方的一个很好的提醒。