C ++无法通过赋值将child *转换为parent *

时间:2014-08-10 11:40:42

标签: c++

使用以下两个类......

//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中以相同的方式使用如上所示工作正常!? 有什么想法吗?

此致

编辑 - 修正了拼写错误

1 个答案:

答案 0 :(得分:0)

我怀疑(你能澄清吗?),你是从另一个静态初始化的类调用静态函数initialize()?由于这一切都将在程序启动时完成(并且C ++不保证文件之间的任何静态初始化顺序),因此可以在构造ServLoc::theNullMonkey;之前调用initialize?!