У меня проблема с использованием интерфейса А.
При попытке вызвать функцию 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
Комментаторы говорят правильные вещи, но, возможно, не так ясно.
В вашем файле AFactory.hpp у вас есть class A;
, Такое утверждение называется «предварительным объявлением». В нем говорится, что A является классом, и что подробности об этом классе будут даны позже. В вашем файле main.cpp по той или иной причине, скорее всего, из-за включающих превенторов, тело вашего #include "A.hpp"
не входит
Это означает, что A
до сих пор не определено. Компилятор знает только то, что A
это класс и ничего больше. Из-за этого компилятор не может справиться aVec[i]->Initialize();
, Сообщение об ошибке говорит это. Измените ваши включающие превенторы на что-то другое, например _A_FILE_HPP_
,
Других решений пока нет …