提问人:Luchian Grigore 提问时间:2/5/2012 最后编辑:CommunityLuchian Grigore 更新时间:2/5/2012 访问量:192
以下是否等同于正向声明?
Is the following equivalent to a forward declaration?
答:
不,它是一个声明,指向 B 的指针。你在这里没有声明 B,只是一个指向它的指针,没有任何关于它的前进。
编辑:我错了,对不起。请参阅其他答案。
评论
B
class
c
可以在同一声明中声明类型和对象。
class B* b;
声明一个类型,以及一个类型指针指向 的对象。该类型不完整,并在它发生的作用域中查找,如果查找未能找到该类的现有声明,则该类型将在最近的封闭命名空间作用域(严格来说是非类非函数原型作用域,通常是命名空间)中命名一个类型。该对象是声明所在的范围的成员(在本例中为 )。B
b
B
class A
在大多数情况下,将完整类型和对象一起声明更为常见,在这种情况下,类型有时是匿名的。例如
struct { int a; int b; } x;
名称范围规则标准的相关部分是 7.1.5.3 [dcl.type.elab] 详细阐述的类型说明符 / 2 以及 3.4.4 和 3.3.1 中的引用部分:
3.4.4 描述了如何在精心设计的类型说明符中对标识符进行名称查找。如果标识符解析为类名或枚举名,则 elaborated-type-specifier 将其引入声明,就像 simple-type-specifier 引入其类型名一样。如果标识符解析为 typedef-name 或模板类型参数,则 elaborated-type-specifier 格式不正确。[ ... ]如果名称查找未找到名称的声明,则 elaborated-type-specifier 的格式不正确,除非它是简单形式的类键标识符,在这种情况下,标识符按照 3.3.1 中所述进行声明。
评论
B
A
::B
A
B
class B;
A::B
void f() { struct s { struct p *ptr; } s; struct p { } p; s.ptr = &p; }
I would like to add few details to answer of Charles Bailey:
class A
{
public:
class B * b;
class C {} *c;
int d;
} a;
B* globalB;
// C* globalC; identifier "C" is undefined here
int main(int argc, char *argv[])
{
a.d = 1;
cout << a.d;
}
Yes, it defines incomplete type and as a pointer to at once. But here comes the fun:
"An exception to the scope visibility of a nested class declaration is when a type name is declared together with a forward declaration. In this case, the class name declared by the forward declaration is visible outside the enclosing class, with its scope defined to be the smallest enclosing non-class scope." (Nested Class DeclarationsB
b
B
)
Which means that type is defined out of scope which allows you to define variable . If you don't want to be defined out of scope , you can use just like it is used with type in my example.B
A
globalB
B
A
{}
C
By the way, this example is correct and its output is: 1
评论
上一个:如何设计模块?
下一个:为什么不能用结构定义模板?
评论
g++ -std=c++98 -pedantic
B
class