2016-11-23 4 views
-2

Я пробовал подкласс singleton, и я столкнулся с ошибкой, когда пытался выполнить печать из конструктора производного класса.ошибки конструктора подкласса singleton

mysingleton.h

#ifndef mysingleton_h 
#define mysingleton_h 
#include <iostream> 
class mysingleton{ 
    public: 
    static mysingleton* singletoninstance; //The one and only one instance 
    static mysingleton* getinstance(); 
    virtual void dosomething() = 0 ; 

protected: 
    mysingleton(const mysingleton&); 
    ~mysingleton(); 

    public: 
     mysingleton(){ 

     }//Prevent clients from creating new singleton 

    }; 



class mysingleton_child:public mysingleton 
{ 
    public: 
    virtual void dosomething() { 
     std::cout <<"In Child Class \n"; 
    } 
    mysingleton_child() 
    { 
    // std::cout <<"In Child Class \n"; 

    } 
~mysingleton_child(); 
}; 

mysingleton.cpp

#include "mysingleton.h" 
mysingleton* mysingleton::singletoninstance = 0; 

mysingleton* mysingleton :: getinstance() 
{ 
    if(!singletoninstance) 
    singletoninstance = new mysingleton_child(); 
    return singletoninstance; 
} 

главный FUNC:

#include <iostream> 
#include "mysingleton.h" 
int main() 
{ 
    mysingleton *pointer = mysingleton::getinstance(); 
    pointer->dosomething(); 
} 

Я получаю ошибку ниже, когда я раскомментировать строку из mysingleton_child конструктора

// std::cout <<"In Child Class \n";

Ошибка:

Error : Undefined symbols for architecture x86_64: "mysingleton::~mysingleton()", referenced from: mysingleton_child::mysingleton_child()

Почему я не в состоянии написать что-нибудь в конструкторе? Вызывается вызванный конструктор или создается только конструктор базовых классов? Кроме того, когда я делаю базовые классы деструктором общедоступными, все работает нормально. Но если у нас есть публичный деструктор, любой уничтожит синглтон.

Не могли бы вы помочь мне с объяснением и заставить меня понять лучше.

+1

Singletons - это анти-шаблон (только прославленные глобальные переменные). В долгосрочной перспективе вы будете намного счастливее, если просто забудете о них. Не используйте синглтоны - пожалуйста! –

+2

И * подклассификация * 'mysingleton'? Это принципиально нарушает обещание, что будет только один экземпляр 'mysingleton'. – user2357112

+0

Проблема не имеет ничего общего с синглонами. Вы бы это видели, если бы создали [mcve]. – juanchopanza

ответ

1

В этой строке позволит каждому получить экземпляр вашего одноточечного непосредственно:

static mysingleton* singletoninstance; //The one and only one instance 

Так что следующая строка не имеет смысла:

static mysingleton* getinstance(); 

Но проблема в том, что вы объявили копировать конструктор и деструктор, но не определил их в вашем .cpp-файле:

mysingleton(const mysingleton&); 
    ~mysingleton(); 

Y ou также объявил обычный конструктор и сделал его public. Это ошибка. Вы можете посмотреть книгу Gang of Four, чтобы лучше понять синглтоны. Также читайте статьи о том, почему одиночные игры могут быть плохими. Просто google «переполнение стека одного стека плохо».

+0

Почему? Его статическая функция, через которую мы пытаемся получить экземпляр? Значит, нет никакой функции? Не могли бы вы объяснить, почему статическая функция не нужна для синглтона. – user2256825

+0

Вам нужна статическая функция, чтобы получить экземпляр вашего синглтона. Но вам не нужно объявлять указатель на экземпляр как открытый член. Обычно он объявляется закрытым. –

0

Поскольку вы объявили ~ mysingleton() и ~ mysingleton_child() в определении класса, вы должны указать их определение.

Смежные вопросы