我经常Empty
向C++对象添加一个方法,以使用类似于以下的代码清除内部状态.
class Foo { private: int n_; std::string str_; public: Foo() : n_(1234), str_("Hello, world!") { } void Empty() { *this = Foo(); } };
这似乎比在构造函数中复制代码更好,但我想知道*this = Foo()
在想要清除对象时是否是一种常见的方法?这有什么问题等着咬我的背面?有没有其他更好的方法来实现这种事情?
我让构造函数调用我的函数:
class Foo { private: int n_; std::string str_; public: Foo() { Reset(); } void Reset() { n_ = 1234; str_ = "Hello, world!"; } };
是的,您首先将字符串初始化为空字符串,然后进行分配,但这更加清晰.
潜在问题?你怎么知道*这真的是一个Foo?
你使用这个Empty方法做的事情与将新构造的对象手动分配给变量(Empty函数所做的事情)基本相同.
就个人而言,我将删除Empty方法,并用以下方法替换该方法的所有用法:
// let's say, that you have variables foo and pfoo - they are properly initialized. Foo foo, *pfoo; // replace line "foo.Empty()" with: foo = Foo(); // replace line "pfoo->Empty()" with: delete pfoo; pfoo = new Foo(); // or *pfoo = Foo();
我觉得这个Empty方法没有任何优势.它隐藏了被称为女巫的对象真正发生的事情,这个名字也不是最好的选择.
如果调用者真的想要一个干净的对象 - 他自己构建对象没有问题.
另外,考虑使对象不可变,即,在构造时,它们不能被改变.在很多场景中,这可以避免意外的副作用.