C++ 调用静态C++;C中的方法在编译时提供未定义的引用
下面是一组简单的文件,它们重现了我遇到的问题: c、 h: c、 cpp: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
#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
是有效的。该死,这毕竟是初始化。业余的错误。谢谢该死,这毕竟是初始化。业余的错误。谢谢