Проблема наследования C ++ с пространствами имен - PullRequest
1 голос
/ 12 ноября 2010

ОК, я искал, но не могу из-за ума найти причину, почему это не должно работать:

Базовый класс (misc / interface / handler.h)

#ifndef __t__MISC_VIRTUAL_HANDLER_H
#define __t__MISC_VIRTUAL_HANDLER_H
#pragma message("Starting with 'handler.h'")

namespace t {
    namespace misc {
        namespace interface {
            class Handler {
                public:
                    Handler();
                    virtual ~Handler();

                    virtual int setup() = 0;
                    virtual int teardown() = 0;
                    virtual int update() = 0;
                protected:
                private:
            };
        }
    }
}

#pragma message("Ending with 'handler.h'")
#endif // __t__MISC_VIRTUAL_HANDLER_H

Производный класс (graphics / handler.h):

#ifndef __t_GRAPHICS_HANDLER_H
#define __t_GRAPHICS_HANDLER_H

#include "../misc/interface/handler.h"

namespace t {
    namespace graphics {
        class Handler: public t::misc::interface::Handler {
            public:
                Handler();
                virtual ~Handler();

                int getResolutionX() { return m_resolutionX; }
                int getResolutionY() { return m_resolutionY; }
                bool getFullscreen() { return m_isFullscreen; }

            protected:
            private:
                unsigned int m_resolutionX, m_resolutionY;
                bool m_isFullscreen;

        }; // class Handler
    } // namespace graphics
} // namespace t
#endif // __t_GRAPHICS_HANDLER_H

... что кажется довольно тривиальным.

Реализация производного класса (graphics / handler.cpp):

#include "handler.h"

t::graphics::Handler::Handler(): t::misc::interface::Handler() {

}

t::graphics::Handler::~Handler() {
}

... что тоже должно быть действительно тривиально, но выдает ошибку:

src\graphics\handler.cpp|5|undefined reference to `t::misc::interface::Handler::Handler()'

Я использую MinGW с блоками кода и все стандартные настройки, которые использует CB, я пытался создать ту же ситуацию с тестовыми классами, и она работает как задумано, как в одной среде, так и в Linux с vanilla g ++.

Ответы [ 2 ]

5 голосов
/ 12 ноября 2010

Я не вижу никакой реализации t::misc::interface::Handler::Handler() в вашем коде - и он будет вызываться конструктором унаследованного класса, поэтому ему нужна реализация.Компоновщик не может его найти, поэтому он жалуется.

Просто измените:

Handler();
virtual ~Handler();

в абстрактном классе на:

Handler() {}
virtual ~Handler() {}

и вы готовыидти.

3 голосов
/ 12 ноября 2010

Кроме того, идентификаторы, начинающиеся с двух подчеркиваний, недопустимы в C ++ (поскольку они зарезервированы для компилятора). На практике они не должны быть проблемой в препроцессоре, но здесь лучше ошибиться: просто не используйте их.

...