信号函数调用静态函数有关问题
信号函数调用静态函数问题
信号函数调用类static成员函数,成员函数调用static成员。
编译报
^[[A/tmp/ccUqABiC.o: In function `main':
stTest.cpp:(.text+0x14b): undefined reference to `CStTest::initmap'
/tmp/ccUqABiC.o: In function `CStTest::get()':
stTest.cpp:(.text._ZN7CStTest3getEv[CStTest::get()]+0x4): undefined reference to `CStTest::a'
/tmp/ccUqABiC.o: In function `CStTest::GetMap()':
stTest.cpp:(.text._ZN7CStTest6GetMapEv[CStTest::GetMap()]+0x10): undefined reference to `CStTest::initmap'
collect2: ld returned 1 exit status
------解决方案--------------------
类的 static 成员变量必须在类的定义之外定义一次
在 .cpp 文件中加上
INTMAP CStTest::initmap;
int CStTest::a;
就可以了。
------解决方案--------------------
问题1 pModule->initmap.insert(make_pair(a,b));这样调用initmap不可以,initmap是静态的 只能是CStTest::initmap这样调用
问题2 g_pModule->GetMap().clear(); 这个也有问题 ,g_pModule->GetMap();返回的是map的指针,调用clear()函数 应该用解引用运算符 g_pModule->GetMap()->clear();
问题 3 就是2楼说的,静态成员需在类的外面定义一下
------解决方案--------------------
好像还有个问题 g_pModule = pModule 他们只想同一块内存,delete pModule之后也会把g_pModule这片内存也删除了,除非你知道这样做,不过还是注意点比较好
信号函数调用类static成员函数,成员函数调用static成员。
- C/C++ code
#include <iostream> #include <map> using namespace std; typedef std::map<int,int> INTMAP; class CStTest { public: CStTest(){}; ~CStTest(){}; public: static void put() { a=5; } static int *get() { return &a; } INTMAP *GetMap() { return &initmap; } public: static int a; static INTMAP initmap; }; CStTest *g_pModule;
- C/C++ code
#include "stTest.h" #include <signal.h> void SigCapture(int sig) { int a = *(CStTest::get()); g_pModule->GetMap().clear(); } int main() { signal(SIGHUP, SigCapture); signal(SIGINT, SigCapture); signal(SIGTERM, SigCapture); signal(SIGABRT, SigCapture); CStTest *pModule = new CStTest; g_pModule = pModule; int a=1; int b=2; pModule->initmap.insert(make_pair(a,b)); delete pModule; }
编译报
^[[A/tmp/ccUqABiC.o: In function `main':
stTest.cpp:(.text+0x14b): undefined reference to `CStTest::initmap'
/tmp/ccUqABiC.o: In function `CStTest::get()':
stTest.cpp:(.text._ZN7CStTest3getEv[CStTest::get()]+0x4): undefined reference to `CStTest::a'
/tmp/ccUqABiC.o: In function `CStTest::GetMap()':
stTest.cpp:(.text._ZN7CStTest6GetMapEv[CStTest::GetMap()]+0x10): undefined reference to `CStTest::initmap'
collect2: ld returned 1 exit status
------解决方案--------------------
类的 static 成员变量必须在类的定义之外定义一次
在 .cpp 文件中加上
INTMAP CStTest::initmap;
int CStTest::a;
就可以了。
------解决方案--------------------
问题1 pModule->initmap.insert(make_pair(a,b));这样调用initmap不可以,initmap是静态的 只能是CStTest::initmap这样调用
问题2 g_pModule->GetMap().clear(); 这个也有问题 ,g_pModule->GetMap();返回的是map的指针,调用clear()函数 应该用解引用运算符 g_pModule->GetMap()->clear();
问题 3 就是2楼说的,静态成员需在类的外面定义一下
------解决方案--------------------
好像还有个问题 g_pModule = pModule 他们只想同一块内存,delete pModule之后也会把g_pModule这片内存也删除了,除非你知道这样做,不过还是注意点比较好