Перед использованием статических элементов я должен их инициализировать, как в этом Example.Инициализация статического члена класса (для обработчика сигналов)
Я хотел бы сделать то же самое в моем коде. Но это не работает. НКУ говорит мне: undefined reference to MainClass::TheStatic1
Код:
#include <iostream>
using namespace std;
Базовый конструктор класса inits 'а' с данным аргументом
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();
}
Попытки в основной() для решения (яп, некоторые из них просто угадать)
// 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). Этот обработчик может получить доступ только к статическим членам. Управление двумя группами процессов, поэтому мне нужны два похожих класса обработки потоков.
Отключить тему: Будьте очень осторожны, что вы делаете в обработчике сигналов. Как правило, все, что вы хотите сделать, это установить флаг для внутреннего использования и получить чертову из уклонения. – user4581301
В исходном файле (глобальная область действия, а не в функции) вам необходимо определить «MainClass :: TheStatic1;» и «MainClass :: TheStatic2;». –
Возможный дубликат: http://stackoverflow.com/questions/3536372/defining-static-members-in-c –