Вызов метода интерфейса C ++ вызывает указатель на неполный в VS2012

У меня проблема с использованием интерфейса А.

При попытке вызвать функцию Initialize () для любого указателя, хранящегося в векторе aVec
VisualStudio сообщает: «Ошибка: недопустимый указатель на неполный класс».

Кто-нибудь знает, как реализовать этот интерфейс таким образом, который позволяет мне вызывать интерфейсную функцию на базовом указателе без приведения его к конкретному типу реализации?

Ошибка происходит в main.cpp.
Я приложил весь источник внизу:

A.hpp:

     #ifndef _A_HPP_
#define _A_HPP_
class A {
private:
int number;

public:
A();
virtual ~A();
virtual bool Initialize();

int GetNumber();
void SetNumber(int number);
};
#endif /* _A_HPP_ */

a.cpp:

     #include "A.hpp"A::A() {
}

A::~A() {
}

bool A::Initialize() {
return true;
}

int A::GetNumber() {
return this->number;
}
void A::SetNumber(int number) {
this->number = number;
}

B.hpp:

     #ifndef _B_HPP_
#define _B_HPP_
class B : public A{
private:
char* abc;

public:
B();
~B();
bool Initialize();
};
#endif /* _B_HPP_ */

B.cpp:

     #include "B.hpp"B::B(){
}

B::~B(){
delete[] abc;
}

bool B::Initialize(){
this->abc = new char[10];
}

AFactory.hpp

     #ifndef _AFACTORY_HPP_
#define _AFACTORY_HPP_
class A;

class AFactory {
public:
static A* GetInstance(int index);
};
#endif /* _AFACTORY_HPP_ */

AFactory.cpp

     #include "AFactory.hpp"#include "A.hpp"#include "B.hpp"A* AFactory::GetInstance(int index) {
A* a;
if(index == 0)a = new B();
else a = 0;
return a;
}

main.cpp

     #include "A.hpp"#include "B.hpp"#include "AFactory.hpp"#include <vector>
using namespace std;

int main() {
vector<A*> aVec;
aVec.push_back(AFactory::GetInstance(0));
aVec.push_back(AFactory::GetInstance(0));
aVec.push_back(AFactory::GetInstance(0));

for(int i = 0; i < 3; i++) aVec[i]->Initialize();
}

Большое спасибо!
Xenogenesis

0

Решение

Комментаторы говорят правильные вещи, но, возможно, не так ясно.

В вашем файле AFactory.hpp у вас есть class A;, Такое утверждение называется «предварительным объявлением». В нем говорится, что A является классом, и что подробности об этом классе будут даны позже. В вашем файле main.cpp по той или иной причине, скорее всего, из-за включающих превенторов, тело вашего #include "A.hpp" не входит

Это означает, что A до сих пор не определено. Компилятор знает только то, что A это класс и ничего больше. Из-за этого компилятор не может справиться aVec[i]->Initialize();, Сообщение об ошибке говорит это. Измените ваши включающие превенторы на что-то другое, например _A_FILE_HPP_,

1

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

Других решений пока нет …

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