C++ 如何在C++;

C++ 如何在C++;,c++,typedef,C++,Typedef,例如,类A有一个类B的成员。一般来说,为了最小化编译依赖性,我们经常让类A包含B的指针,并在类A的声明中预先声明类B。看起来像这样: //B.h class B { .... }; //A.h class B; class A { B*b; A(); ... }; //A.cpp #include "B.h" A::A() { b=new B(); ... }; typedef class { .... }B; 但现在我有一个问题:如果B

例如,类A有一个类B的成员。一般来说,为了最小化编译依赖性,我们经常让类A包含B的指针,并在类A的声明中预先声明类B。看起来像这样:

//B.h
class B
{
    ....
};

//A.h
class B;
class A
{
    B*b;
    A();
    ...
};

//A.cpp
#include "B.h"
A::A()
{
    b=new B();
    ...
};
typedef class
{
 ....
}B;
但现在我有一个问题:如果B类是用typedef定义的,如下所示:

//B.h
class B
{
    ....
};

//A.h
class B;
class A
{
    B*b;
    A();
    ...
};

//A.cpp
#include "B.h"
A::A()
{
    b=new B();
    ...
};
typedef class
{
 ....
}B;

在这种情况下,前面预先声明的方法将不起作用。我应该如何在A.h.中预先声明B类

在代码
typedef类{….}B中
,它是一个未命名类,
B
是未命名类的类型别名

如果不定义一个未命名的类(即提供类主体),则不可能声明该类;而且不能声明
B
是未命名类的typedef

没有typedef的转发声明。通常,typedef可以为稍后完成的不完整类型声明别名,但未命名类不能填充这两个角色中的任何一个

删除了针对选民反馈的进一步建议


注:问题使用了“预先申报”一词。C++标准不使用术语“预声明”或更常见的行话“向前声明”。在该标准的术语中,类的前向声明简称为类声明。如果上下文中已经不清楚,可以说“声明不是定义”来澄清这一点。

typedef B类foo之后,只需正常声明类。这样的类有什么意义?在cpp中,您的类不需要typedef。顺便说一句,如果你没有圆圈包含,只需在标题中包含B标题。@Stargateur
class B
B
在这种情况下是不同的。我问这个问题是因为我可能使用其他人编写的类,他们使用typedef声明他们的类。我不想更改他们的原始文件。所以我想知道是否有办法解决这个问题。@KevinZhu你不能只在你的头中包含他们的头?你的A.h可以包括B.h?一个相关的问题OP已经在做这件事了,所以你可以把最后一句话作为评论发表。不知道为什么会被否决。第一句回答了OP的问题,文章的其余部分给出了解决OP问题的另一种方法@barakmanos没有规定答案不能有额外的建议。我只是说“你不能”并不是一个有用的答案。我没有否决你的答案(它是正确的,简单明了)。我只是建议作为一种评论可能更合适。我的猜测是,它被否决了,因为这里的社区由相当多的吹毛求疵者组成。事实上,第一个声明非常有用,因为OP似乎不知道你明确提到的“向前宣言”一词。我将投票补偿……答案表明OP问题没有解决方案,更重要的是,它清楚地解释了为什么会这样+从我这里得到1。