2011-10-10 108 views
7

我有两个类,foo和bar。 foo包含bar并包含指向条形对象的std :: vector指针。在运行时的某个点,bar必须访问指向其他bar对象的这个向量。因此,foo包含一个名为getBarObjects()的方法,该方法返回指针数组。向前声明与类类型的向量 - 不允许指向不完整类类型的指针

因此,我转发在foo中声明foo。我obvioulsy也必须转发声明我使用的方法 - foo :: getBarObjects()。当它返回指向数组的指针数组时,我陷入了一个恶性循环。

我不能转发include Bar,然后简单地转发include getBarObjects(),因为这会导致“不完整的类型名称是不允许的”。

了foo.h:

#include "bar.h" 
#include <vector> 

class foo { 
    public: 
     foo(); 
     ~foo(); 
     std::vector<bar*> getBarObjects(); 
    private: 
     std::vector<bar*> barObjects; 
} 

bar.h:

class foo; 
std::vector<bar*> foo::getBarObjects();  // error, doesn't know bar at this point 

class bar { 
    public: 
     bar(foo *currentFoo); 
     ~bar(); 
     bool dosth(); 
    private: 
     foo *thisFoo; 
} 

bar.cpp:

#include "bar.h" 

bool bar(foo *currentFoo) { 
    thisFoo = currentFoo; 
} 

bool bar::dosth() { 
    thisFoo->getBarObjects();  // error, pointer to inomplete class type is not allowed 
} 

如果我只是包括周围的其他方式,我将有后来在foo也是一样的问题。有什么建议么?

回答

15

您不能转发声明成员。

相反,bar.cpp应该#includefoo.hbar.h。问题解决了。

在一般情况下,如果你使用的顺序:

  • 正向声明所有类的类型
  • 定义所有类类型的类成员的
  • 机构

一切都会好起来。

+0

梅,简单的解决问题似乎很大。谢谢! – Aerius

1

您忘记了在foo.h中声明向量。您还可以从getBarObjects中按值返回vector,这可能不是您想要的,并且成员函数的前向声明是无用的。

另请参阅:使用标头警卫。根据您的情况(std::shared_ptr,unique_ptr)优先使用原始指针。小心const尼斯。

+0

我使用的头警卫,没有后顾之忧,我只是让他们在这里为我所有键入的,为了避免额外的类名和诸如此类的东西混淆。谢谢 – Aerius

4

除非从另一个头文件访问任何一个类的内部,否则不需要包含foo.h或bar.h。在头文件中根据需要声明这些类,然后在源文件中包含这两个头文件。

foo.h中

#include <vector> 
class bar; 
class foo { 
    public: 
     foo(); 
     ~foo(); 
     std::vector<bar*> getBarObjects(); 
    private: 
     std::vector<bar*> barObjects; 
}; 

bar.h

class foo; 
class bar { 
    public: 
     bar(foo *currentFoo); 
     ~bar(); 
     bool dosth(); 
    private: 
     foo *thisFoo; 
} 

吧。CPP

#include "foo.h" 
#include "bar.h" 

bool bar(foo *currentFoo) { 
    thisFoo = currentFoo; 
} 

bool bar::dosth() { 
    thisFoo->getBarObjects(); 
} 
相关问题