繁体   English   中英

名称空间的C ++继承问题

[英]C++ inheritance problem with namespaces

好的,我一直在寻找,但出于我的机智,无法找到为什么它不起作用的原因:

基类(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所使用的标准设置如何,我已经尝试通过测试类构建相同的情况,并且可以按预期工作,无论是在同一环境中还是在使用vanilla g ++的Linux中。

我在您的代码中看不到t::misc::interface::Handler::Handler()任何实现-它将由继承类的构造函数调用,因此需要实现。 链接器找不到它,因此它抱怨。

只是改变:

Handler();
virtual ~Handler();

在抽象类中:

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

然后您就可以出发了。

顺便说一句,在C ++中,以两个下划线开头的标识符是非法的(因为它们是为编译器保留的)。 在实践中,它们在预处理器中应该成为问题,但是最好在安全方面犯错误:根本不要使用它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM