对象的全局指针会导致访问冲突?

时间:2012-05-04 08:11:11

标签: c++

也许你能够为我清除一些东西,因为我不确切地知道我的想法存在缺陷。首先是一些代码:

Talker.h:

class talker       
{
    public:
    talker();
    void sayHello() {cout << "Hello";} ;
};

anotherClass.h:

class anotherClass
{
    public:
    anotherClass();
    void doSomethingYourself() { cout << "will do"; };
    void askHimToSayHello() { pointerToTalker->sayHello; };  
                          //Access violation, bad pointer(?)
};

COMMON.H:

 static talker *pointerToTalker;       
      // if I add here "= new talker", code works fine

main.cpp中:

#include "common.h"
int main()
{
    pointerToTalker = new talker;            // Here is the bug, but why?
    pointerToTalker -> sayHello;             // says Hello alright

    anotherClass *pointerToAnotherClass = new anotherClass;
    pointerToAnotherClass -> doSomething ();  //Does something OK

    pointerToAnotherClass -> askHimToSayHello(); // Causes access violation 
}

当然函数有点复杂,每个函数都在相应的.cpp中实现,包括“common.h”。我的问题是 - 为什么pointerToTalker,如果在main()内初始化不能在anotherClass :: AskHimToSayHello()中工作?它应该在它被使用时指向有效内存。 这是我的“Hello world,OOP!”顺便问一下,如果对我没有希望,请保持温柔:)

抱歉幼稚的风格顺便说一下。它帮助我减少了我所拥有的代码,使其更紧凑,而不会让我失去大局:)。

1 个答案:

答案 0 :(得分:4)

由于

static talker *pointerToTalker;   

不是全球性的。在此上下文中,static为每个包含common.h的翻译单元(cpp文件+包含的文件)提供变量内部链接。

您需要将其声明为extern

extern talker *pointerToTalker;   

并在单个实现文件中初始化它。

声明static将为每个翻译单元创建pointerToTalker的副本。所以你要从main.cpp初始化那个。其他人未初始化,因此您遇到未定义的行为。正确的方法是:

//common.h:
extern talker *pointerToTalker;    

//common.cpp
#include "common.h"
talker* pointerToTalker = new talker;