C++ 构造函数中的外部副作用

C++ 构造函数中的外部副作用,c++,constructor,side-effects,C++,Constructor,Side Effects,请看以下代码: #include <framework_i_hate.h> int main() { XFile file("./my_file.xxxx", "create"); XObject object("my_object"); // modify the object object.Write(); } #包括 int main(){ XFile文件(“/my_file.xxxx”,“创建”); XObject对象(“我的对象”); //修改对象 obj

请看以下代码:

#include <framework_i_hate.h>
int main() {
  XFile file("./my_file.xxxx", "create");
  XObject object("my_object");
  // modify the object
  object.Write();
}
#包括
int main(){
XFile文件(“/my_file.xxxx”,“创建”);
XObject对象(“我的对象”);
//修改对象
object.Write();
}
尝试猜测
对象
将保存在何处。。。是的,你猜对了。我觉得这太神奇了,我想写一些类似于
object.Save(file)
的东西,但这不是必需的。显然,
framework\u i\u hate.h
中有一个全局变量,它在
文件
构造函数中被修改。你怎么看待构造器内部的这种副作用

如何隐藏这种行为


猜框架的人也有好处。

非常混乱,很难理解帖子,最后的问题非常修辞。
全局变量是邪恶的,还有什么可以补充的呢?

关于这一点,我们可以说什么还不够明显:这是一个相当严重的副作用,因为:

  • 除非您非常了解该框架,否则产生的行为是意外的,根本不可预测的

  • 在面向对象编程中,全局程序状态通常不是一个好主意。(事实上,全球状态可能永远都不是一个好主意,所以最好尽量避免。)

  • 很可能这个框架也不是线程安全的。(想想当两个并发线程都创建一个
    XFile
    对象,然后其中一个线程写入一个
    XObject
    …它将保存在哪里时会发生什么情况?)


虽然这个线程被标记为C++,而不是.Net,但是我以前看到的这种“反模式”是在一个不太严重、更理智的形式,即DB事务范围。

< P>我更愿意看到XFile和XObjor之间的关系是明确的,我同意这个“魔术”太好隐藏。我还质疑为什么要给对象命名,除非API的其他部分的名称很重要


全局变量被轻视的原因有很多,这只是一个例子。

@aaa:我认为回答这个问题的最好方法是这样做,是的。我应该给这个
[root framework]
加上标签吗?最后,这仍然是一个太多的咆哮,并没有真正的有用。