2013-04-09 31 views
0

我有使用接口A.C++调用接口方法原因指针到不完全在VS2012

虽然试图调用存储在所述载体的任何指针初始化()函数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

请注意,您的保护名称是保留的,所以您有未定义的行为。您不能使用以下划线开头且后跟大写字母的名称。 – 2013-04-09 18:23:13

+0

我不知道。 谢谢,我将来会考虑。 – Xenogenesis 2013-04-09 18:27:35

+0

它甚至可以解决你的问题,所以我现在就做。如果没有,请发布完整的错误。 – 2013-04-09 18:28:30

回答

1

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

在您的AFactory.hpp文件中,您有class A;。这种说法被称为“前向声明”。它指出A是一个班级,关于这个班级的细节将在稍后给出。在你的文件main.cpp中,出于这个或那个原因,最有可能是因为包含防御者,你的#include "A.hpp"的主体不包括在内。

这意味着A仍未定义。编译器只知道A是一个类,没有别的。因为那个编译器不能处理aVec[i]->Initialize();。错误消息是这样说的。修改您的包含预防措施,如_A_FILE_HPP_