Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在类主体中转发声明未声明的类,而无需交朋友或声明指针_C++_Forward Declaration - Fatal编程技术网

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
的类定义内。