C++类前向声明​​的缺点?

C++类前向声明​​的缺点?

问题描述:

我想在我的软件中使用类的前向声明,所以我可以使用typedefs
并在类声明中使用它们。C++类前向声明​​的缺点?

水木清华这样的:

class myclass; 
typedef boost::shared_ptr<myclass> pmyclass; 
typedef std::list<pmyclass > myclasslist; 

class myclass : public baseclass 
{ 
private:  // private member declarations 
     __fastcall myclass(); 

public:   // public member declarations 
     __fastcall myclass(myclass *Parent) 
      : mEntry(new myclass2()) 
      { 
      this->mParent = Parent; 
      } 
     const myclass *mParent; 
     myclasslist mChildren; 
     boost::scoped_ptr<myclass2> mEntry; 
}; 

所以我的问题是: 有没有在这个方法中的任何缺点?我记得有关前向声明的析构函数问题的一些讨论,但我没有把所有东西都拿出来。
还是有任何其他选择来实现这样的事情?

谢谢。

编辑: 我发现我指的讨论:here

从C++标准:

5.3.5/5:

“如果要删除的对象具有不完整的类类型在 删除点,并且完整的类具有非平凡析构函数或 解除分配函数,则行为未定义。“

+0

好吧,对不起愚蠢,但我已经阅读过,我的问题在这里是: 如果它是在宣布后立即应该没有问题,对吧? – Andrew 2009-08-10 01:23:10

+1

是的,那么我就是这么读的。让我们希望我们的编译器符合标准:-) – 2009-08-10 01:34:04

主要缺点是一切。前向声明是一种妥协方式,可以节省编译时间并让对象之间具有循环依赖关系。但是,成本是你只能使用该类型作为参考,并且不能对这些参考做任何事情。这意味着,没有继承,没有将它作为一个值传递,没有在该类中使用任何嵌套类型或typedef等等......这些都是很大的缺点。

你正在谈论的具体破坏问题是,如果你只是转发声明一个类型,碰巧只在模块中删除它,行为是未定义的,并且不会引发错误。

例如:

class A; 

struct C 
{ 
    F(A* a) 
    { 
     delete a; // OUCH! 
    } 
} 

微软C++ 2008不会调用任何析构函数,并抛出以下警告:

warning C4150: deletion of pointer to incomplete type 'A'; no destructor called 
      : see declaration of 'A' 

所以,你必须保持警觉,这不应该是如果出了问题您将警告视为错误。

+5

如果所有的痛苦都能在一个月内为您节省30分钟的编译时间,但花费您一小时的时间,并且让您头痛不已 - 那么您会失败......购买CPU有更多的内核并且可以进行并行编译。至少你可以在更高的帧率下玩Skyrim。 – Eloff 2012-01-28 00:21:20