C++如何在已被声明为外部类的内部类中使用变量

C++如何在已被声明为外部类的内部类中使用变量,c++,C++,可以在外部类中声明的内部类中使用变量吗。 我想做到如下几点。有可能吗。 我得到以下错误 prog.cc:在构造函数'Outer::Inner::Inner'中:prog.cc:12:25:错误:非静态数据成员'Outer::i'的使用无效 内部{i=5;} #include <iostream> using namespace std; class Outer { public: int i; class Inner; // forward declarati

可以在外部类中声明的内部类中使用变量吗。 我想做到如下几点。有可能吗。 我得到以下错误

prog.cc:在构造函数'Outer::Inner::Inner'中:prog.cc:12:25:错误:非静态数据成员'Outer::i'的使用无效 内部{i=5;}

    #include <iostream>
using namespace std;
class Outer {
public:
    int i;
    class Inner; // forward declaration of Outer::Inner
    friend class Inner;
    class Inner {
        Inner() {
            i = 5;
        };
    };
};
int main() {
    return 0;
}

不像java,C++内部类与创建它们的外部类没有连接。您必须传入指向外部类的指针或引用。

来自在线提供的标准工作草案:

9.7嵌套类声明[class.nest] 一个类可以在另一个类中声明。在另一个类中声明的类称为嵌套类。嵌套类的名称是其封闭类的本地名称。嵌套类在其封闭类的范围内

例如:

int x; 
int y;
struct enclose {  
    int x; 
    static int s;
    struct inner { 
        void f(int i) { 
            int a = sizeof(x); // OK: operand of sizeof is an unevaluated operand 
            x = i; // error: assign to enclose::x 
            s = i; // OK: assign to enclose::s 
            ::x = i; // OK: assign to global x 
            y = i; // OK: assign to global y 
        } 
        void g(enclose* p, int i) { 
            p->x = i; // OK: assign to enclose::x 
        } 
    };     
}; 
inner* p = 0; // error: inner not in scope 
从文档中提供的示例可以看出,嵌套类访问封闭类的非静态成员的唯一方法是通过指向封闭类的指针


这就是在void genclose*p,int i中发生的情况,说friend class Inner是多余的;,嵌套类是成员,因此可以访问私有和受保护的定义,就像外部类的任何其他成员一样。转发声明也是冗余的,即使需要朋友声明,您也可以将其放在内部声明的定义之后。@JonathanWakely转发声明是双重冗余的,朋友宣言也是一种前进declaration@Caleth但是,如果尚未看到Outer::Inner,那么友元声明在名称空间范围声明了一个类型,这是非常不同的。如果它意味着完全不同的东西,它就不是多余的。我认为这是C++语言的一个缺陷。不要这么快就把某个你不理解的语言中的缺陷称之为“@ SabetayToros”,如果你把它称为缺陷,那么我想看看你在爪哇的缺陷列表。内部类与任何其他类类似,只是它嵌套在外部类之下,因此与外部类有可见的关联。例如,您可以创建一个HashMap,其中某些方法返回一个包含键值对的HashMap::条目。如果此条目不可见地包含对创建它的HashMap的引用,那么您突然不能仅复制条目对象或返回它们,例如,HashMap可能是堆栈分配的example@SabetayToros内部类的一个用途是能够在其所属的范围内声明内容,例如,您可以使用container::iterator,实际上它是否只是内部类的typedef并不重要