C++ 初始化静态成员类(用于信号处理程序)
在使用静态成员之前,我必须像这样初始化它们 我想在我的代码中也这样做。但它不起作用。 GCC告诉我:C++ 初始化静态成员类(用于信号处理程序),c++,multithreading,event-handling,static-members,C++,Multithreading,Event Handling,Static Members,在使用静态成员之前,我必须像这样初始化它们 我想在我的代码中也这样做。但它不起作用。 GCC告诉我: main类的未定义引用::static1 代码: #include <iostream> using namespace std; 包含两个相似的成员,唯一的区别是从基类派生的构造函数调用 class MainClass { public: MainClass(){}; ~MainClass(){}; static MyStaticDerived1 TheS
main类的未定义引用::static1
代码:
#include <iostream>
using namespace std;
包含两个相似的成员,唯一的区别是从基类派生的构造函数调用
class MainClass {
public:
MainClass(){};
~MainClass(){};
static MyStaticDerived1 TheStatic1;
static MyStaticDerived2 TheStatic2;
};
主要
int main() {
MainClass TheMainClass;
// [PROBLEM]: gcc:undefined reference to `MainClass::TheStatic1'
TheMainClass.TheStatic1.SayHello();
TheMainClass.TheStatic2.SayHello();
}
尝试在main()中求解(jap,其中一些只是猜测)
我为什么要这样做?
MyStaticDerived是由信号处理程序(SIGCHILD)调用的线程处理类。此处理程序只能访问静态成员。管理两组进程,因此我需要两个类似的线程处理类。复制粘贴代码作为工作示例。感谢@ThomasMatthews和@user4581301让这个答案成为可能。请参见主功能上方的解决方案。 未来信息请访问@ThomasMatthews提供的链接
#include <iostream>
using namespace std;
class MyStaticBase {
public:
MyStaticBase(int iSetA):a(iSetA){};
~MyStaticBase(){}
int a;
void SayHello(){
std::cout << "Keep a signalhandler SHORT\n"
<< "Just set a flag =)\n"
<< "thx to all!\n"
<< " Instance: " << a << std::endl;
}
};
// Derived Classes
class MyStaticDerived1:public MyStaticBase{
public:
MyStaticDerived1():MyStaticBase(1){ }
};
class MyStaticDerived2:public MyStaticBase{
public:
MyStaticDerived2():MyStaticBase(2){}
};
class MainClass {
public:
MainClass(){};
~MainClass(){};
static MyStaticDerived1 TheStatic1;
static MyStaticDerived2 TheStatic2;
};
// [ Solution ]
MyStaticDerived1 MainClass::TheStatic1;
MyStaticDerived2 MainClass::TheStatic2;
int main() {
MainClass TheMainClass;
TheMainClass.TheStatic1.SayHello();
TheMainClass.TheStatic2.SayHello();
}
#包括
使用名称空间std;
类MyStaticBase{
公众:
MyStaticBase(int-iSetA):a(iSetA){};
~MyStaticBase(){}
INTA;
void SayHello(){
std::cout将粘贴代码复制到工作示例中。将Thx复制到@ThomasMatthews和@user4581301中,使此答案成为可能。请参阅主函数上方的解决方案。
未来信息请访问@ThomasMatthews提供的链接
#include <iostream>
using namespace std;
class MyStaticBase {
public:
MyStaticBase(int iSetA):a(iSetA){};
~MyStaticBase(){}
int a;
void SayHello(){
std::cout << "Keep a signalhandler SHORT\n"
<< "Just set a flag =)\n"
<< "thx to all!\n"
<< " Instance: " << a << std::endl;
}
};
// Derived Classes
class MyStaticDerived1:public MyStaticBase{
public:
MyStaticDerived1():MyStaticBase(1){ }
};
class MyStaticDerived2:public MyStaticBase{
public:
MyStaticDerived2():MyStaticBase(2){}
};
class MainClass {
public:
MainClass(){};
~MainClass(){};
static MyStaticDerived1 TheStatic1;
static MyStaticDerived2 TheStatic2;
};
// [ Solution ]
MyStaticDerived1 MainClass::TheStatic1;
MyStaticDerived2 MainClass::TheStatic2;
int main() {
MainClass TheMainClass;
TheMainClass.TheStatic1.SayHello();
TheMainClass.TheStatic2.SayHello();
}
#包括
使用名称空间std;
类MyStaticBase{
公众:
MyStaticBase(int-iSetA):a(iSetA){};
~MyStaticBase(){}
INTA;
void SayHello(){
std::cout Off-topic:在信号处理程序中要非常小心。通常,您只需要设置一个标志供内部使用,并从道奇中解脱出来。在源文件中(全局范围,而不是在函数中),您需要定义main类::TheStatic1;
和main类::TheStatic2;
。可能重复:可能重复:@thomasatthews它不是重复的。示例是关于POD的,我将初始化整个类作为一个成员。离题:在信号处理程序中执行的操作要非常小心。通常,您只需要设置一个fla在源文件中(全局范围,而不是函数中),您需要定义MainClass::TheStatic1;
和MainClass::TheStatic2;
。可能重复:可能重复:@ThomasMatthews它不是重复的。示例是关于POD的,我将作为一个成员初始化整个类。
// Attempts:
// MyStaticDerived1::MyStaticDerived1(); // error: cannot call constructor ‘MyStaticDerived1::MyStaticDerived1’ directly [-fpermissive]
// MainClass::TheStatic1 TheStatic1; //error: expected ‘;’ before ‘TheStatic1’
// MainClass::TheStatic2 TheStatic2 = 0;
// MainClass::TheStatic1();
// MyStaticDerived1 MainClass::TheStatic1; //qualified-id in declaration before ‘;’ token
// MyStaticDerived1 MainClass::TheStatic1{}; //qualified-id in declaration before ‘{’ token
#include <iostream>
using namespace std;
class MyStaticBase {
public:
MyStaticBase(int iSetA):a(iSetA){};
~MyStaticBase(){}
int a;
void SayHello(){
std::cout << "Keep a signalhandler SHORT\n"
<< "Just set a flag =)\n"
<< "thx to all!\n"
<< " Instance: " << a << std::endl;
}
};
// Derived Classes
class MyStaticDerived1:public MyStaticBase{
public:
MyStaticDerived1():MyStaticBase(1){ }
};
class MyStaticDerived2:public MyStaticBase{
public:
MyStaticDerived2():MyStaticBase(2){}
};
class MainClass {
public:
MainClass(){};
~MainClass(){};
static MyStaticDerived1 TheStatic1;
static MyStaticDerived2 TheStatic2;
};
// [ Solution ]
MyStaticDerived1 MainClass::TheStatic1;
MyStaticDerived2 MainClass::TheStatic2;
int main() {
MainClass TheMainClass;
TheMainClass.TheStatic1.SayHello();
TheMainClass.TheStatic2.SayHello();
}