0

我在使用接口 A 时遇到问题。

在尝试对存储在向量 aVec VisualStudio 中的任何指针调用 Initialize() 函数时,会显示“错误:未完成的类类型指针无效”。

有谁知道如何以一种允许我在基本指针上调用接口函数而不将其转换为特定实现类型的方式来实现这个接口?

错误发生在 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];
     }

工厂.hpp

     #ifndef _AFACTORY_HPP_
     #define _AFACTORY_HPP_
     class A;

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

工厂.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;
     }

主文件

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

非常感谢你!异种

4

1 回答 1

1

评论者说的是对的,但可能不是那么清楚。

在您的 AFactory.hpp 文件中,您有class A;. 这种声明称为“前向声明”。它指出 A 是一个类,关于这个类的详细信息将在稍后给出。在您的文件 main.cpp 中,出于这个或那个原因,很可能是由于包含防止器,您的主体#include "A.hpp"不包含在内。

这意味着A仍然没有定义。编译器只知道这A是一个类,没有别的。因为那个编译器无法处理aVec[i]->Initialize();. 错误消息是这样说的。将您的包含防止器修改为其他内容,例如_A_FILE_HPP_.

于 2013-04-09T18:47:36.243 回答