Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化静态成员类(用于信号处理程序)_C++_Multithreading_Event Handling_Static Members - Fatal编程技术网

C++ 初始化静态成员类(用于信号处理程序)

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

在使用静态成员之前,我必须像这样初始化它们

我想在我的代码中也这样做。但它不起作用。 GCC告诉我:
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();
}