强制处理类中的所有成员变量
Enforce handling of all member variables in a class
有没有一个概念可以确保在实现者忘记扩展应该处理所有成员的方法时,向现有类添加成员会产生某种错误/警告?
如果一个类实现了几个必须接触所有元素的方法(例如导入/导出),那么很容易忘记要适应的一个或多个方法。编译器不会识别它,在很多情况下行为都会像预期的那样(当然,除非你有正确的测试)
我目前的尝试是在每个可能被默默遗忘的方法中测试类的大小。但当然,这并不容易阅读,不安全,而且与编译器/平台/构建类型无关(所以我不喜欢它)。
class C
{
int element1;
int element2;
int element3; <--- newly added without adapting operator==()
public:
void import_me();
void export_me();
bool operator== (const C&);
void dump();
};
实现可能隐藏在不同的/大的文件中:
void C::import_me(){
assert( sizeof( *this ) == 12 ); // this is my attempt of doing this
read_fn( element1 );
read_fn( element2 );
read_fn( element3 );
}
void C::export_me(){
assert( sizeof( *this ) == 12 ); // this is my attempt of doing this
write_fn( element1 );
write_fn( element2 );
write_fn( element3 );
}
/// the implementer forgot to adapt this method
bool C::operator==(const C &other) {
assert( sizeof( *this ) == 8 ); <--- this would fail
if( element1 != other.element1 ) return false;
if( element2 != other.element2 ) return false;
return true;
}
我的下一个尝试是用宏生成一个矩阵(成员X方法),必须在每个方法中手动填充,但这对我来说似乎不是很干净,我怀疑它是否执行良好。。
有没有一个概念可以确保在实现者忘记扩展应该处理所有成员的方法的情况下,向现有类添加成员会产生某种错误/警告?
是:测试驱动设计。也就是说,在更改代码之前,请添加用于检查新成员分配情况的测试。然后,运行测试(它们应该会失败)。然后,修复实现。
不幸的是,这取决于你作为开发人员的注意力,所以只有当你把它变成一种习惯时,它才会起作用:(
这只是一个想法,而不是一个解决方案。
将所有成员打包到一个元组中。编写一些模板元编程代码,将给定的函数应用于元组的每个成员。在每个方法中使用该模板元函数,该方法必须经过所有成员,并使其为该方法应用特定的函数。
boost::mpl可能是一个起点。
但请注意:这并不容易,这是一项先进的技术。根据您的经验,您的里程数可能会有所不同。
在这种情况下,我使用了python脚本+clang库。Python脚本通过解析生成import_me、export_me等方法类定义。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查