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];
     }

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

どうもありがとうございました!異種発生

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 に答える