Vs2013: static成员不链接
vs2013: static member does not link
我正试图为我正在从事的一个项目编写一个简单的FSM。我从这个链接中得到了GoF状态样本,但它似乎已经被bug -当我试图将其构建到vs2013中时,我得到了以下错误:
1>------ Build started: Project: Poco-stateMachine, Configuration: Release Win32 ------
1>Server.obj : error LNK2001: unresolved external symbol "public: static class OffState & __cdecl OffState::theOffState(void)" (?theOffState@OffState@@SAAAV1@XZ)
1>C:UsersWoodyDocumentsVisual Studio 2013ProjectsPoco-tcpServer4ReleasePoco-stateMachine.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
唯一使用"OffState::theOffState"的地方不是函数调用——它是对类内部声明的一个单例的引用。
Vehicle::Vehicle ():mState(&OffState::theOffState()) {}
我非常头疼,想弄清楚它,但还是什么也没弄清楚。任何想法?
FSM样例代码:
> class Vehicle {
> public:
> Vehicle ();
> // whatever other ctors are needed
> void turnOn(); // { mState->turnOn(*this); }
> void engageGear(); // { mState->engageGear (*this); }
> void disengageGear(); //{ mState->disengageGear (*this); }
> void turnOff(); //{ mState->turnOff (*this); }
> // other operations
> private:
> friend class VehState;
> void changeState (VehState* newState); // { mState = newState; }
> private:
> VehState* mState;
> };
>
> class VehState {
> public:
> virtual void turnOn(Vehicle&); // allows changing Vehicle object state pointer
> virtual void engageGear(Vehicle&); // same as above
>
> virtual void disengageGear(Vehicle&);
> virtual void turnOff(Vehicle&);
> protected:
> void changeState (Vehicle& veh, VehState* newState) { veh.changeState(newState); }
> };
>
> class MovingState : public VehState {
> public:
> static MovingState& theMovingState(); // Singleton design pattern
> virtual void disengageGear(Vehicle& veh);
> };
>
> class IdleState : public VehState {
> public:
> static IdleState& theIdleState(); // Singleton design pattern
> virtual void engageGear(Vehicle& veh) {changeState(veh, &MovingState::theMovingState()); }
> };
>
> class OffState : public VehState {
> public:
> static OffState& theOffState(); // Singleton design pattern
> virtual void turnOn(Vehicle& veh) { changeState(veh, &IdleState::theIdleState()); }
> };
>
> // implement default behavior in VehState method implementations
> // implementations of Vehicle methods:
> Vehicle::Vehicle () :
> mState(&OffState::theOffState()) {}
>
> void Vehicle::turnOn() { mState->turnOn(*this); }
> void Vehicle::engageGear() { mState->engageGear (*this); }
> void Vehicle::disengageGear() { mState->disengageGear (*this); }
> void Vehicle::turnOff() { mState->turnOff (*this); }
>
> void Vehicle::changeState (VehState* newState) {
> mState = newState;
> }
>
unresolved symbol
意味着你的代码有声明,但没有theOffState
的定义。我想代码示例,你正在编译,是没有完成的。
我猜《设计模式概览》的作者通过注释行"//单例设计模式"以及在状态模式
示例中"//在VehState方法实现中实现默认行为"暗示了一些东西编辑:我已经添加了一些代码,只是为了使其可编译(但你应该考虑逻辑和继续编码):
#include <string>
#include <iostream>
using namespace std;
class Vehicle {
public:
Vehicle ();
// whatever other ctors are needed
void turnOn(); // { mState->turnOn(*this); }
void engageGear(); // { mState->engageGear (*this); }
void disengageGear(); //{ mState->disengageGear (*this); }
void turnOff(); //{ mState->turnOff (*this); }
// other operations
private:
friend class VehState;
void changeState (VehState* newState); // { mState = newState; }
private:
VehState* mState;
};
class VehState {
public:
virtual void turnOn(Vehicle&); // allows changing Vehicle object state pointer
virtual void engageGear(Vehicle&); // same as above
virtual void disengageGear(Vehicle&);
virtual void turnOff(Vehicle&);
protected:
void changeState (Vehicle& veh, VehState* newState) { veh.changeState(newState); }
};
class MovingState : public VehState {
public:
static MovingState& theMovingState() // Singleton design pattern
{
static MovingState stateMoving;
return stateMoving;
}
virtual void disengageGear(Vehicle& veh) {}
};
class IdleState : public VehState {
public:
static IdleState& theIdleState() // Singleton design pattern
{
static IdleState stateIdle;
return stateIdle;
}
virtual void engageGear(Vehicle& veh) {changeState(veh, &MovingState::theMovingState()); }
};
class OffState : public VehState {
public:
static OffState& theOffState() // Singleton design pattern
{
static OffState stateOff;
return stateOff;
}
virtual void turnOn(Vehicle& veh) { changeState(veh, &IdleState::theIdleState()); }
};
// implement default behavior in VehState method implementations
void VehState::turnOn(Vehicle& obj) {
obj.turnOn();
}
void VehState::engageGear(Vehicle& obj) {
obj.engageGear();
}
void VehState::disengageGear(Vehicle& obj) {
obj.disengageGear();
}
void VehState::turnOff(Vehicle& obj) {
obj.turnOff();
}
// implementations of Vehicle methods:
Vehicle::Vehicle () :
mState(&OffState::theOffState()) { }
void Vehicle::turnOn() {
mState->turnOn(*this);
}
void Vehicle::engageGear() {
mState->engageGear (*this);
}
void Vehicle::disengageGear() {
mState->disengageGear (*this);
}
void Vehicle::turnOff() {
mState->turnOff (*this);
}
void Vehicle::changeState (VehState* newState) {
mState = newState;
}
int main()
{
return 0;
}
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 类和类成员的链接
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- C++ - 使用 std::list,如何打印对象的私有成员的链接列表?
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 单独库中的类成员函数定义和链接依赖项
- emplace_back会导致静态 constexpr 成员上出现链接错误
- 类中常量成员函数的 c++ 链接错误
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 获取 constexpr 全局变量(不是静态成员)的链接器符号
- 使用 <filesystem> C++17 中的成员的链接错误
- gcc 和 clang 中 constexpr 静态成员变量的链接器错误
- (C++)(链接错误)模板成员函数上未解析的外部
- 静态成员函数访问静态私有变量时的链接器错误
- 关于在 ndk r15 中的类中初始化的静态成员的不满意链接错误
- 为什么添加静态数据成员会导致链接器失败
- 类模板的成员函数模板找不到定义,尽管存在显式实例化。不链接
- C++ 使用 .chain().method() 链接成员函数 vers ->chained(0->method()
- 静态成员初始化链接错误
- 链接器为某些上下文中使用的集成静态常量成员提供错误"undefined symbol"