C++ 调用静态C++;C中的方法在编译时提供未定义的引用

C++ 调用静态C++;C中的方法在编译时提供未定义的引用,c++,c,static-methods,static-members,undefined-reference,C++,C,Static Methods,Static Members,Undefined Reference,下面是一组简单的文件,它们重现了我遇到的问题: c、 h: c、 cpp: #include <stdio.h> extern "C" { #include "c.h" } class Bubu { public: static Bubu *getInstance() { if (_instance == NULL) { _instance = new Bubu; } return _instance; } private: sta

下面是一组简单的文件,它们重现了我遇到的问题:

c、 h:

c、 cpp:

#include <stdio.h>
extern "C" {
#include "c.h"
}

class Bubu {
public:
  static Bubu *getInstance() {
    if (_instance == NULL) {
      _instance = new Bubu;
    }
    return _instance;
  }

private:
  static Bubu *_instance;
};

Bubu *_instance = NULL;

void dummy() {
  printf("bubu called\n");
  Bubu *ptr = Bubu::getInstance();
}
当我编译时,我得到以下结果:

g++ -W -Wall -c c.cpp -o c.o
c.cpp: In function ‘int bubu()’:
c.cpp:24: warning: unused variable ‘ptr’
g++ -W -Wall main.cpp c.o -o main
c.o: In function `Bubu::getInstance()':
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x7): undefined reference to `Bubu::_instance'
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x1d): undefined reference to `Bubu::_instance'
c.cpp:(.text._ZN4Bubu11getInstanceEv[Bubu::getInstance()]+0x24): undefined reference to `Bubu::_instance'
collect2: ld returned 1 exit status
make: *** [main] Error 1
Compilation exited abnormally with code 2 at Tue Dec 15 09:15:21
我已经看到了其他类似问题的答案,但问题可能是调用静态方法时缺少Bubu::或者在类声明之外缺少静态成员的初始化,或者缺少外部“C”构造。我很确定我没有犯那些错误。。。我肯定在做其他的。
你能解释一下发生了什么吗?

当你在类内定义一个静态变量时,你也必须在类外定义它。你想这么做,但是

Bubu *_instance = NULL;
将只创建一个指向Bubu的全局指针,而不是实例化类中的静态指针。你需要使用

Bubu *Bubu::_instance = NULL;

要告诉编译器这将是类内的静态变量。

在类内定义静态变量时,还必须在类外定义它。你想这么做,但是

Bubu *_instance = NULL;
将只创建一个指向Bubu的全局指针,而不是实例化类中的静态指针。你需要使用

Bubu *Bubu::_instance = NULL;

告诉编译器这将是类中的静态变量。

我认为这与名称混乱有关
Bubu*Bubu::_instance
?那么
bububu*bububu::_instance=NULL?我假设c.h包含
bubu
,而不是
dummy
。否则,在编译main.cpp时,您应该会收到更多警告。'c++程序不应该有:
#include
,但是,有:
#include
是有效的。我认为这与名称混乱有关
bububu*bububu::\u instance
,而
bubububu*bububu:\u instance=NULL?我假设c.h包含
bubu
,而不是
dummy
。否则,在编译main.cpp时,您应该会收到更多警告…c++程序不应该有:
#include
,但是,有:
#include
是有效的。该死,这毕竟是初始化。业余的错误。谢谢该死,这毕竟是初始化。业余的错误。谢谢