在非模板库类中拥有静态成员的最佳方法是什么,而不必在类用户上承担定义成员的负担?
说我想提供这个课程:
class i_want_a_static_member
{
static expensive_resource static_resource_;
public:
void foo()
{
static_resource_.bar();
}
};
Run Code Online (Sandbox Code Playgroud)
那么类的用户一定不要忘了某处定义静态成员(如已经回答了 很多 次):
// this must be done somewhere in a translation unit
expensive_resource i_want_a_static_member::static_resource_;
Run Code Online (Sandbox Code Playgroud)
我在下面有一个答案,但它有一些缺点.是否有更好和/或更优雅的解决方案?
我的函数是静态的非常重要,我需要访问和修改另一个静态/非静态类成员,以便以后打印出来.我怎样才能做到这一点?
#include <iostream>
class MyClass
{
public:
static int s;
static void set()
{
MyClass::s = 5;
}
int get()
{
return MyClass::s;
}
MyClass()
{
this->set();
}
};
void main()
{
auto a = new MyClass();
a->set(); // Error
std::cout << a->get() << std::endl; // Error
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
LNK2001: unresolved external symbol "public: static int MyClass::s" (?s@MyClass@@2HA)
LNK1120: 1 unresolved externals
Run Code Online (Sandbox Code Playgroud) class CommandManager {
public:
void sendText(std::string command);
static bool CommandManager::started;
private:
bool parseCommand(std::string commands);
void changeSpeed(std::vector<std::string> vec);
void help(std::vector<std::string> vec);
};
Run Code Online (Sandbox Code Playgroud)
这是客户端代码:
CommandManager::started = true;
Run Code Online (Sandbox Code Playgroud)
将这两个文件链接在一起我得到:
1> UAlbertaBotModule.obj:错误LNK2001:未解析的外部符号"public:static bool CommandManager :: started"(?started @ CommandManager @@ 2_NA)
1> C:\ Development\School\cmput350-uofabot\UAlbertaBot\vs2008\Release\UAlbertaBot.dll:致命错误LNK1120:1个未解析的外部
我在哪里错了?
我正在遵循这个单例模式,为什么错误LNK2001:在这种情况下未解析的外部符号?我的问题看起来很相似,但我的问题不在于静态实例的定义.我的问题是从另一个类解析静态GetInstance()定义.
我的错误似乎不同,或以前的答案是不充分的.我已经尝试过这样的建议,"你需要在课堂外定义s_instance"这对我来说是没有意义的cpp noob.我在标题中声明静态,并在cpp中定义它们的实现.
我也不需要关于单例的线程安全的讲座,处理程序绑定使用信号2 ...
State.h
class State
{
public:
State(void);
~State(void);
static State* instance;
static State* GetInstance();
...
};
Run Code Online (Sandbox Code Playgroud)
State.cpp
State::AppState mCurrentState;
boost::signals2::signal<void ()> mSignal;
State* instance = NULL;
State* GetInstance()
{
if( instance == NULL)
{
instance = new State();
return instance;
}
else
{
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
所有这些都很好.然后当我尝试访问这样的单例时
State *state = State::GetInstance();,我得到"未解析的外部符号"错误.
错误LNK2019:未解析的外部符号"public:static class State*__cdecl State :: GetInstance(void)"(?GetInstance @State @@ SAPAV1 @ XZ)在函数"public:virtual void __thiscall MesherApp :: setup(void)"中引用(?设置@ MesherApp …
我想跟踪实例MyClass,所以我std::map<int,MyClass*>在MyClass中添加了一个私有静态变量.现在的问题是它导致未解析的外部符号,我不知道如何调试.我该如何解决这个问题?
注意:我是一名经验丰富的Java程序员和新手C++程序员,我也会将其作为一个JNI dll,这就是我需要跟踪实例的原因MyClass.