C++ 如何在类主体中转发声明未声明的类,而无需交朋友或声明指针
我知道两种在类主体中声明未嵌套类的方法 首先是:C++ 如何在类主体中转发声明未声明的类,而无需交朋友或声明指针,c++,forward-declaration,C++,Forward Declaration,我知道两种在类主体中声明未嵌套类的方法 首先是: class A { friend class B; // B is forward-declared + friend }; 第二个是: class A { class B* ptr; // B is forward-declared + pointer }; 可以在类主体之外向前声明一个类,但是出于某种原因,让我们忘记这个选项 因此,我想宣布这位成员: class A { /* somehow declare B i
class A
{
friend class B; // B is forward-declared + friend
};
第二个是:
class A
{
class B* ptr; // B is forward-declared + pointer
};
可以在类主体之外向前声明一个类,但是出于某种原因,让我们忘记这个选项
因此,我想宣布这位成员:
class A
{
/* somehow declare B in the body*/
B* getInstanceB();
};
值得一提的是:
通过声明指针:
class A
{
class B* pointer;
B* getInstanceB(); //fine
};
朋友声明:
class A
{
friend class B;
B* getInstanceB(); //GCC 5.3.0 issues error, MSVC compiles
};
我深感遗憾的是,没有这样的前向声明语法:
class ::[optional-namespace::]ClassName;
类::[可选名称空间::]ClassName
这将区分嵌套类转发声明和未嵌套类转发声明。在当前的标准中,是否可以用其他方式实现这一点?因此,您要做的是在另一个类中有一个类的实例,但在“容器类”之后有定义 像这样
HTH那么您要做的是在另一个类中有一个类的实例,但在“容器类”之后有定义 像这样 嗯 我深感遗憾的是,没有这样的前向声明语法:
class ::[optional-namespace::]ClassName;
这将区分嵌套类转发声明和未嵌套类转发声明。在现行标准中,是否有可能以其他方式实现这一点
不,我想没有
我深感遗憾的是,没有这样的前向声明语法:
class ::[optional-namespace::]ClassName;
这将区分嵌套类转发声明和未嵌套类转发声明。在现行标准中,是否有可能以其他方式实现这一点
不,我认为没有。要在
a
的类定义中向前声明名为B
的类,而不将该类嵌套在a
中,可以执行以下操作:
class A {
typedef class B B;
// do something with B
};
可以找到一个解释
这实际上起作用的演示:要在
A
的类定义中向前声明名为B
的类,而不将该类嵌套在A
中,可以执行以下操作:
class A {
typedef class B B;
// do something with B
};
可以找到一个解释
这确实有效的演示:在
A
之外向前声明B
有什么问题?@ernon没有什么问题。但是如果还有其他的可能性,我很想知道:)让我来看看这个。当一个问题有一个现有的解决方案并且效果很好时,您试图找出是否有一个不同的解决方案。@R Sahu不要这样。我可以只使用指针而不使用引用,或者我可以只使用宏而不使用模板。“这两件事都能做,而且都会在一定程度上失败。”布莱克·摩西,这是公平的。我只是想确定我明白你想要实现什么。在A
之外向前声明B
有什么问题吗?@ernon没有什么问题。但是如果还有其他的可能性,我很想知道:)让我来看看这个。当一个问题有一个现有的解决方案并且效果很好时,您试图找出是否有一个不同的解决方案。@R Sahu不要这样。我可以只使用指针而不使用引用,或者我可以只使用宏而不使用模板。“这两件事都能做,而且都会在一定程度上失败。”布莱克·摩西,这是公平的。我只是想确定我明白你想要完成什么。不,这就是我在这个例子中想要避免的。它是关于在类A主体内部而不是外部向前声明B类的。你可以在类A内部做一个名称空间语句,看:不,这就是我在这个例子中想要避免的。它是关于在类A主体内部而不是外部向前声明B类的。你可以在类A内部做一个名称空间语句,看:这不等于向前声明吗?(测试将B*ptr;
放在类A之后)@DieterLück OP希望转发声明在A
的类定义内。这不等于转发声明吗?(测试将B*ptr;
放在类A之后)@DieterLück OP希望转发声明位于A
的类定义内。