派生列表中的C++范围运算符



我在WinImp.h中收到一个错误,说'Root' has not been declared。如果我不使用范围运算符(class WinImp : public BaseDef),则错误error: expected class-name before '{' token)。有人知道为什么会这样吗?

根.h

class Root {
    public:
        class BaseDef {
            public:
                virtual void foo() = 0;
                virtual void bar() = 0;
        };
    private:
        #ifdef _WIN32
        friend class WinImp;
        #else
        friend class NixImp;
        #endif
        BaseDef* imp;
        BaseDef* getImp();
    public:
        Root() : imp(getImp()) {}
        void foo();
        void bar();
};

根.cpp

#include "Root.h"
void Root::foo() {
    imp->foo();
}
void Root::bar() {
    imp->bar();
}

WinImp.h

#ifdef _WIN32
#include "Root.h"
class WinImp : public Root::BaseDef {
    public:
        void foo();
        void bar();
};
#endif

赢啦.cpp

#include "WinImp.h"
#ifdef _WIN32
    void WinImp::foo() {
    }
    void WinImp::bar() {
    }
    Root::BaseDef* Root::getImp() {
        return static_cast<BaseDef*>(new WinImp());
    }
#endif

您正在访问 Root 中的BaseDef接口,因此它们应该是公共的:

class BaseDef 
{
 public:
   virtual void foo() = 0;
   virtual void bar() = 0;
};

在 WinImp.cpp 中,foo(), bar()需要返回类型,并且它们不在根范围内,应该是:

void WinImp::foo() { }
void WinImp::bar() { }

修复WinImp.cpp如下所示:

#include "WinImp.h"
#ifdef _WIN32
    // WinImp is not scoped within Root
    void WinImp::foo() {
    }
    void WinImp::bar() {
    }
    Root::BaseDef* Root::getImp() {
        return dynamic_cast<BaseDef*>(new WinImp());
    }
#endif

最新更新