获取“未定义的vtable”;参数化构造函数的错误

发布于 2025-02-11 01:09:21 字数 3604 浏览 1 评论 0原文

我有这个错误:

未定义的引用vtable

我无法找出其根本原因。

我确实尝试在Google中进行搜索,但仍然无法弄清楚原因。

这是代码:

istate.hpp - >完整的状态接口类

class IState {

    public:

        IState() = delete;

        IState(ICallbacks &callbacks)
        : m_callbacks(callbacks) {
        }

        virtual ~IState() = default;

        IState(IState &state)
        :m_callbacks(state.m_callbacks) {
        };

        IState& operator=(IState &state) {
            this->m_callbacks = state.m_callbacks;
            return *this;
        };

        IState(IState &&state) = delete;
        IState& operator=(IState &&state) = delete;

        bool operator== (const IState &state) {
            return (this->state_id == state.state_id);
        }

        virtual const IError& stateEntry(ISubject &Subject) = 0;
        virtual const IError& stateExit(ISubject &Subject) = 0;
    
    private:
        std::string state_id = std::string("");
        ICallbacks& m_callbacks;
};

cstate.hpp - >接口类的部分实现

class CState : public IState {

    public:

        CState() = delete;

        CState(ICallbacks &callbacks)
        : IState(callbacks),
          m_ccallbacks(static_cast<CCallbacks&>(callbacks)) {
        }

        virtual ~CState() {
            
        };

        CState(CState &state)
        :IState(state),
         m_ccallbacks(static_cast<CCallbacks&>(state.m_ccallbacks))  {

        }

        CState& operator=(CState &state) {
            this->m_ccallbacks = static_cast<CCallbacks&>(state.m_ccallbacks);
            return *this;
        }

        CState(CState &&state) = delete;
        CState& operator=(CState &&state) = delete;

        const IError& stateEntry(ISubject &Subject) override {
            CSubject &cSubject = static_cast<CSubject&>(Subject);
            return StateEntry(cSubject);
        };
        const IError& stateExit(ISubject &Subject) override {
            CSubject &cSubject = static_cast<CSubject&>(Subject);
            return StateExit(cSubject);
        }

        virtual const IError& StateEntry(CSubject &Subject) = 0;
        virtual const IError& StateExit(CSubject &Subject) = 0;
    
    private:
        CCallbacks& m_ccallbacks;
};

activestate.hpp - &gt;现在完成cstate.hpp

class ActiveState : public CState {

    public:

        ActiveState() = delete;

        ActiveState(ICallbacks &callbacks)
        : CState(callbacks) {

        }

        ActiveState(ActiveState &state)
        : CState(state) {
        }

        ActiveState& operator=(ActiveState &state) = default;

        virtual ~ActiveState() {

        }

        const IError& StateEntry(CSubject &Subject) override {
            return NO_ERROR;
        };
        const IError& StateExit(CSubject &Subject) override {
            return NO_ERROR;
        };
};

现在,每当我使用基类指针创建activeState对象时,它会通过编译,但与此错误链接时失败:

In function `ActiveState::ActiveState(ICallbacks&)':
File.cpp:(.text.11ActiveStateC2ERNS2_15ICallbacksE[_ZN611ActiveStateC5ERNS2_15ICallbacksE]+0x26): undefined reference to `vtable for ActiveState'

请让我让我知道我出错了哪里,以及如何解决这个问题。

I have this error coming up:

undefined reference to vtable

I'm unable to figure out the root cause of it.

I did try to search in Google, but still unable to figure out the reason.

Here is the code:

IState.hpp -> Complete state interface class

class IState {

    public:

        IState() = delete;

        IState(ICallbacks &callbacks)
        : m_callbacks(callbacks) {
        }

        virtual ~IState() = default;

        IState(IState &state)
        :m_callbacks(state.m_callbacks) {
        };

        IState& operator=(IState &state) {
            this->m_callbacks = state.m_callbacks;
            return *this;
        };

        IState(IState &&state) = delete;
        IState& operator=(IState &&state) = delete;

        bool operator== (const IState &state) {
            return (this->state_id == state.state_id);
        }

        virtual const IError& stateEntry(ISubject &Subject) = 0;
        virtual const IError& stateExit(ISubject &Subject) = 0;
    
    private:
        std::string state_id = std::string("");
        ICallbacks& m_callbacks;
};

CState.hpp -> Partial implementation of interface class

class CState : public IState {

    public:

        CState() = delete;

        CState(ICallbacks &callbacks)
        : IState(callbacks),
          m_ccallbacks(static_cast<CCallbacks&>(callbacks)) {
        }

        virtual ~CState() {
            
        };

        CState(CState &state)
        :IState(state),
         m_ccallbacks(static_cast<CCallbacks&>(state.m_ccallbacks))  {

        }

        CState& operator=(CState &state) {
            this->m_ccallbacks = static_cast<CCallbacks&>(state.m_ccallbacks);
            return *this;
        }

        CState(CState &&state) = delete;
        CState& operator=(CState &&state) = delete;

        const IError& stateEntry(ISubject &Subject) override {
            CSubject &cSubject = static_cast<CSubject&>(Subject);
            return StateEntry(cSubject);
        };
        const IError& stateExit(ISubject &Subject) override {
            CSubject &cSubject = static_cast<CSubject&>(Subject);
            return StateExit(cSubject);
        }

        virtual const IError& StateEntry(CSubject &Subject) = 0;
        virtual const IError& StateExit(CSubject &Subject) = 0;
    
    private:
        CCallbacks& m_ccallbacks;
};

ActiveState.hpp -> Complete implementation of CState.hpp

class ActiveState : public CState {

    public:

        ActiveState() = delete;

        ActiveState(ICallbacks &callbacks)
        : CState(callbacks) {

        }

        ActiveState(ActiveState &state)
        : CState(state) {
        }

        ActiveState& operator=(ActiveState &state) = default;

        virtual ~ActiveState() {

        }

        const IError& StateEntry(CSubject &Subject) override {
            return NO_ERROR;
        };
        const IError& StateExit(CSubject &Subject) override {
            return NO_ERROR;
        };
};

Now, whenever I create an ActiveState object using a base class pointer, it goes through compilation, but fails in linking with this error:

In function `ActiveState::ActiveState(ICallbacks&)':
File.cpp:(.text.11ActiveStateC2ERNS2_15ICallbacksE[_ZN611ActiveStateC5ERNS2_15ICallbacksE]+0x26): undefined reference to `vtable for ActiveState'

Please let me know where I am going wrong, and how to solve this problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

紙鸢 2025-02-18 01:09:21

对不起,
这是cmakelists.txt的问题。
cmakelists.txt在Glob中缺少ActiveState.CPP。
因此,此错误。
感谢您的帮助。

Sorry guys,
It was a problem with CMakeLists.txt.
The CMakeLists.txt was missing ActiveState.cpp in GLOB.
Hence this error.
Thanks for your help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文