2013-01-15 166 views
0

我可以使用类的前向声明为了将它的定义和实现稍后在程序中使用(类似于函数的做法)吗?类的前向声明

(我需要将一个程序的多个源文件连接到一个文件中,并且我希望将这些类的定义和实现放在该文件的末尾,以使main位于该文件的顶部。)

+2

你试过了吗?你有没有编译错误?编写一个简单的例子不用花一分多钟就可以试试。 – abelenky

+0

或者,您可以将'main'放在底部并忽略问题......无论如何,答案是类的前向声明的使用有限。 –

+0

@abelenky是的,来自MS VS 1的errCode>错误C2079:'student_list'使用未定义的类'Student_list' – MTVS

回答

2

是的,你可以在一定程度上。

你必须认识到,C++编译器是相当愚蠢的,不会提前阅读。这就是为什么你必须使用函数原型(其他一些原因)。 现在,编译器解决一个函数并不难。它只是查看函数的返回类型和函数参数的类型,并且只是假设函数在那里,而不知道函数内部的实际内容,因为它在那个点上最终并不重要。

但是,类的内容确实很重要(例如,编译器需要知道类的大小)。但记住关于不读前面的位?当你转发定义一个类时,编译器不知道它里面的内容,因此缺少大量有关它的信息。需要预留多少空间?

因此,您可以转发定义类,但不能将它们用作类型。你可以用它做的唯一事情(在它已被具体声明之前)是指向它的指针(并且用它作为函数返回类型和模板参数,作为指针由 @ Cheersandhth.-Alf指出)。

如果您需要使用的东西不是指针,则应该使用标头(如果您想了解更多信息,请参阅this)。

+0

-1“你可以用它做的唯一事情(在它被具体声明之前)是使用它的指针“。是不正确的。很难猜测“价值类型”的含义。但“不能将它们用作值类型”的印象就像不能用于按值传递的形式参数一样,也是不正确的。 –

+0

@ Cheersandhth.-Alf在你评论过队友之前就纠正了它。 – antonijn

+0

所以你有一个指针,你不能直接引用它,直到你定义了类,除了在代理类中使用它有什么用处? – MTVS

1

没有一个类定义前面的地方,你不能使用任何类成员,也可以创建任何实例,但你可以

  • 使用T *和T &类型,

  • 使用T代表正式返回类型和参数声明(是的甚至值),

  • 使用T作为模板参数,

和可能更多,但以上是我立即想到的。

所以,如果这就是你需要的一切,那么你就会选择前进宣言。

然而,所有的前锋宣布购买你的草图情况添加的工作,保持在两个地相同的代码,所以很难看到它&hellip点;


哦,我只记得,有一个与前瞻性声明不完整的类型,即使用delete p其中p是指向不完全类型相关联的一个特别讨厌的未定义行为。这要求析构函数是微不足道的。如果编译器是好的,那么它会发出警告,但不要指望它。


总之,我只想把main这些代码,它属于哪里,避免所有问题的非常年底