forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Причуды GCC (http://forum.boolean.name/showthread.php?t=17962)

wolfhound512 03.03.2013 19:08

Причуды GCC
 
Объясните, как такое возможно?


Суть проблемы:
есть шаблонный класс
Код:

template <class T> class cSingleton {
protected:
        ...
        static T* _this;
        ...
        cSingleton() {
                assert( _this == NULL );
                _this = (T*) this;
        }
}

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

falcon 04.03.2013 14:35

Ответ: Причуды GCC
 
не совсем понятно поведение..
но и реализация как-то не совсем понятна..
предпочитаю такого рода магию:

Код:

template <class T>
class Singleton
{
protected:
    Singleton() { }
public:
    static T& Instance()
    {
          static T self;
          return self;
    }
};


class Foo : public Singleton<Foo>
{
};


jimon 19.03.2013 13:36

Ответ: Причуды GCC
 
так у тебя в дебагере nullptr или во время запуска ? потому что компилятор имеет право перекраивать код как угодно (обычно это в релизе происходит), и может он перенес твое приравнивание на пару строк ниже

wolfhound512 19.03.2013 14:28

Ответ: Причуды GCC
 
И в дебаггере и во время запуска (программа вылетает).
Сделал исключение для этого класса: убрал наследование от cSingleton, прописал тот же функционал в самом классе (просто скопировал из cSingleton) и оно заработало.


Часовой пояс GMT +4, время: 03:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot