2016-12-30 5 views
1

Перед использованием статических элементов я должен их инициализировать, как в этом 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). Этот обработчик может получить доступ только к статическим членам. Управление двумя группами процессов, поэтому мне нужны два похожих класса обработки потоков.

+0

Отключить тему: Будьте очень осторожны, что вы делаете в обработчике сигналов. Как правило, все, что вы хотите сделать, это установить флаг для внутреннего использования и получить чертову из уклонения. – user4581301

+1

В исходном файле (глобальная область действия, а не в функции) вам необходимо определить «MainClass :: TheStatic1;» и «MainClass :: TheStatic2;». –

+0

Возможный дубликат: http://stackoverflow.com/questions/3536372/defining-static-members-in-c –

ответ

0

Скопируйте код вставки для рабочего примера. Thx to @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(); 
} 
Смежные вопросы