繁体   English   中英

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

[英]Initialising static member class ( for a signal handler )

在使用静态成员之前,我将像在此示例中一样初始化它们。

我想在我的代码中做同样的事情。 但它不起作用。 GCC告诉我: undefined reference to MainClass::TheStatic1

码:

#include <iostream>
using namespace std;    

基类构造函数在给定Argument的'a'中

class MyStaticBase {

public:
  MyStaticBase(int iSetA):a(iSetA){};
  ~MyStaticBase(){}
  int a;

  void SayHello(){
    std::cout << "Say Hello from Static Instance: " << a <<  std::endl;
  }    
};

派生类使用其特定值初始化Base类。

//  First derived Class
class MyStaticDerived1:public MyStaticBase{
public:
  MyStaticDerived1():MyStaticBase(1){  }    
};

// Second derived Class
class MyStaticDerived2:public MyStaticBase{
public:
  MyStaticDerived2():MyStaticBase(2){}    
};

包含两个类似的成员,只有它们是从基类派生的构造函数调用才有区别。

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,其中一些只是猜测)

  // 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

为什么我这样做?

MyStaticDerived是线程处理类,由信号处理程序(SIGCHILD)调用。 此处理程序只能访问静态成员。 管理两组进程,因此我需要两个类似的线程处理类。

复制粘贴代码以获取工作示例。 感谢@ThomasMatthews和@ user4581301使这个答案成为可能。 请参阅主函数上方的解决方案。 Futur信息请在@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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM