2011-04-02 24 views
4

我从问题的答案Forward declare a class's public typedef in c++了解,前宣布一些东西,可以在C的typedef是不可能++。正向声明可能的typedef的C++ 0x

在C++ 0x中可以做这个问题吗?

否则,进行更改,如:

class X {...}; 
typedef X Z; 

class Y {...}; 
typedef Y Z; 

休息客户端代码。

我觉得不应该是这样,因为类型定义的一点是,他们应该做的基本类型对客户透明,所以你可以改变而不会破坏客户端代码执行。

澄清

基本上,可以说,我们有可以有两种选择:

class X {...}; 
typedef X Z; // (1) 

OR

class Z {...}; // (2) 

我希望能够在客户端代码做到这一点:

class Z; // Or something of this effect, sadly this fails in the case of (1) 

而且无论Z是typedef还是类(对于客户端来说都应该是透明的),该代码都不需要更改。

+0

这还不清楚。这个问题是关于类中的typedef声明的,我想说解决方案是用一个名称空间替换或增加类。你不能将声明任何东西转发为其他任何东西,所以'class'不能作为'typedef'声明。这更像你所问的吗? – Potatoswatter 2011-04-02 04:48:50

+0

嗨Potatoswatter,我试图澄清这个问题。 – Clinton 2011-04-02 04:55:35

+0

真的很不错的库编写者为他们的客户端提供公共类型和转发,因此客户端永远不需要手动管理它。客户端只包含库的类型头。这也很好,所以你的库头不会有所有的转发噪音。转发和typedefs在编译时不需要花费任何东西 - 只需将公共类型放在那里即可。 – justin 2011-04-02 04:56:07

回答

1

假设头被包括在用户的消息来源“头”,他们就不会向前声明你的类。如果用户想要一个轻量级标题,给他们一个。

标准库包括一个报头包括前向声明的,<iosfwd>。您可能会采用或适应该惯例,例如"foo_forward.h"

当用户为你的类写一个向前声明,任何地方,他基本上是写你的头你。这是一个站不住脚的安排。

1

typedef为某种类型创建另一个名称。当你做

typedef X Z; 

你告诉编译器“Z是X的另一个名字”。如果它不知道当前的X是什么,那么这个信息是无用的。

当你说

class X; 

编译器至少知道,X是用户定义的类型,这是有帮助的。然后,它可以排除X不是可能需要特殊处理,如void*char的类型之一。

C++ 0x不会改变这一点。