如果我必须组织编译源,这是不好的做法

时间:2014-03-13 16:51:02

标签: c++ xcode nullpointerexception organization

我正在使用Xcode中的C ++项目,我的一个.cpp文件实例化了一些变量。应用程序中的另一个.cpp文件使用这些变量来实例化另一个对象,并且需要将它们实例化为不抛出空指针异常。到目前为止,我的解决方案只是拖放(XCode简单)第一个文件在构建阶段顺序中的第二个文件。它现在工作正常,但我觉得它不是最佳解决方案,如果我需要手动组织编译顺序以使应用程序正常运行,我的代码会出现根本性的错误。

我是不是应该在功能之外实例化,或者什么是黄金法则?感谢。

编辑:请求的示例。 问题在于观察者/事件系统。 在源文件中,我这样做:

Trigger* mainMenu_init = new Trigger(std::vector<Event*> {
    // Event(s):
    event_gameInit,

}, [](Event* e) {
    // Action(s):
    std::cout << "Hello World" << std::endl;

});

在触发器的构造函数中,要求Event添加为观察者:

for(Event* event : events)
        event->addObserver(this);

但是,事件只是外部指针,所以如果它们没有初始化(它们在另一个源文件中),那么这个初始化将会失败。所以我发现如果我自己没有组织编译阶段,随机触发器将无法工作,而其他将依赖于它们是否在Event.cpp文件之前或之后构建。

1 个答案:

答案 0 :(得分:2)

我假设您正在讨论全局变量(或静态变量)的非平凡初始化,例如(在文件的顶层):

MyObject *myPtrObject = new MyObject(42, "blah");
MyObject myOtherObject;

(&#34;平凡&#34;粗略地讲,当没有涉及构造函数且一切都只涉及常量时,初始化;所以如果你将指针初始化为零,那么在实际调用任何代码之前它将为零)

C ++中不同源文件之间的初始化顺序为 NOT GUARANTEED 。它恰好取决于Apple当前系统中文件的顺序,但可能会改变

所以,是的,有根本性的错误。

黄金规则

  • 重要提示:在初始化全局对象时,请勿使用来自不同源文件的任何其他全局对象。
  • 不要过度使用全局变量。从软件设计的角度来看,它们有许多缺点。
  • 简化全局对象的初始化。这样可以更容易坚持第一条规则。

对您的计划一无所知,当然很难提供更具体的设计建议。