наследование — оператор области действия C ++ в списке деривации

Я получаю сообщение об ошибке в WinImp.h, которое говорит 'Root' has not been declared, Если я не использую оператор области (class WinImp : public BaseDef) ошибка error: expected class-name before '{' token). Кто-нибудь знает, почему это происходит?

Root.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();
};

Root.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

WinImp.cpp

#include "WinImp.h"#ifdef _WIN32
void WinImp::foo() {

}

void WinImp::bar() {

}

Root::BaseDef* Root::getImp() {
return static_cast<BaseDef*>(new WinImp());
}
#endif

1

Решение

Вы получаете доступ BaseDef интерфейсы в Root, поэтому они должны быть публичными:

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

В WinImp.cpp, foo(), bar() нужен тип возвращаемого значения, и они не находятся внутри области действия Root, должны быть:

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

Другие решения

исправлять 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
2

По вопросам рекламы [email protected]