当我向派生类添加构造函数时,我收到链接错误

时间:2014-04-10 12:05:17

标签: c++

当我在我的派生类中的constructor中发表评论时,我得到'错误LNK2001:未解析的外部符号'

我的基类定义了一个虚拟OnEnterOnExit,我的派生类实现了这些函数,一切都很好。然后当我向我的派生类添加一个构造函数时,它不会编译。

1>State.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall State::OnEnter(void)" (?OnEnter@State@@UAEXXZ)
1>State.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall State::OnExit(void)" (?OnExit@State@@UAEXXZ)

国家是我的基础。

//State.h
#ifndef STATE_H
#define STATE_H

class State
{
public:
    virtual void OnEnter();
    virtual void OnExit();
};

#endif

//State.cpp
#include "State.h"


//DateEntryView.h
#ifndef DATE_ENTRY_VIEW_H
#define DATE_ENTRY_VIEW_H

#include "State.h"

class DateEntryView
    : public State
{
public:
    DateEntryView();
public:
    void OnEnter();
    void OnExit();
};

#endif

//DateEntryView.cpp
#include "DateEntryView.h"

DateEntryView::DateEntryView()
{

}

void DateEntryView::OnEnter()
{

}

void DateEntryView::OnExit()
{

}

2 个答案:

答案 0 :(得分:0)

您必须在州级别中将OnEnter和OnExit方法设为纯虚拟。

像这样

class State
{
public:
  virtual void OnEnter() = 0;
  virtual void OnLeave() = 0;
};

class StateOne : public virtual State
{

public:

  StateOne()
  {
  }

  virtual void OnEnter()
  {
  }

  virtual void OnLeave()
  {
  }

};


int main()
{
  State *state = new StateOne;
  state->OnEnter();
  state->OnLeave();
  delete state;

  return 0;
}

或者如果您不想要它们纯虚拟添加大括号

class State
{
public:
  virtual void OnEnter()
  {
  }
  virtual void OnLeave()
  {
  }
};

答案 1 :(得分:0)

您尚未在提供的源中提供OnEnter或OnExit的实现。

如果他们应该有实现,那么你可能有一个state.c文件,当你编译时,会生成一个state.o文件。生成可执行文件时,需要在链接阶段包含此文件。

如果它们不应该有实现,例如。如果它是一个抽象基类,那么你需要像这样声明它们:

virtual void OnEnter() = 0;
virtual void OnExit() = 0;