使用以下两个类......
//pure virtual...
class Monkey
{
public:
virtual ~Monkey(){}
virtual void clearMonkeys() = 0;
virtual std::shared_ptr<std::vector<sf::Text>> getMonkeyListPtr() = 0;
virtual void addMonkey(String message,Vector2f position,float depthValue) = 0;
};
class NullMonkey : public Monkey
{
public:
NullMonkey () {/*Do Nothing*/}
virtual ~NullMonkey () {/*Do Nothing*/}
virtual void clearMonkeys(){/*Do Nothing*/};
virtual std::shared_ptr<std::vector<sf::Text>> getMonkeyListPtr()
{
//Do Nothing but...
//Return NULL shared pointer
std::shared_ptr<std::vector<sf::Text>> nullSharedPointer;
return nullSharedPointer;
//Of course I am ASSUMING I will check for NULL pointer...
}
virtual void addMonkey(String message,Vector2f position,float depthValue){/*Do Nothing*/};
};
......我在施法时遇到问题。 具体来说,我使用这些类作为静态成员,并且如果一个类不可用,我会使用Null类来防止应用程序崩溃。它还增加了热交换子类以进行调试的能力。
不幸的是以下......
class ServLoc
{
public:
ServLoc();
static void initialize()
{
theMonkey = &theNullMonkey; //Error here
}
//...
static Monkey* theMonkey;
static NullMonkey theNullMonkey;
};
... throws&#39;无法在分配中将NullMonkey *转换为Monkey *。
我还应该添加add我已经在.cpp文件中定义了静态成员
NullMonkey ServLoc::theNullMonkey;
Monkey* ServLoc::theMonkey;
有趣的是我之前在类似的情况下使用了类似的类,并没有得到这个错误。我很茫然。它可能很简单但仍然......
实际上我使用这种方法实现了一个日志类。这意味着我可以热交换各种形式的日志记录(包括空记录器来禁用日志记录),只需使用ServLoc静态成员就可以访问记录器...
class Logger
{
public:
virtual ~Logger() {}
virtual void log(const logType type,const char *message) = 0;
//...
};
class NullLogger : public Logger
{
public:
virtual ~NullLogger() {/*Do Nothing*/};
NullLogger() {/*Do Nothing*/};
virtual void log(const logType type,const char *message) {/*Do Nothing*/};
//...
};
这在ServLoc中以相同的方式使用如上所示工作正常!? 有什么想法吗?
此致
编辑 - 修正了拼写错误
答案 0 :(得分:0)
我怀疑(你能澄清吗?),你是从另一个静态初始化的类调用静态函数initialize()?由于这一切都将在程序启动时完成(并且C ++不保证文件之间的任何静态初始化顺序),因此可以在构造ServLoc::theNullMonkey;
之前调用initialize?!