Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++;从嵌套类方法访问变量_C++_Oop - Fatal编程技术网

C++ c++;从嵌套类方法访问变量

C++ c++;从嵌套类方法访问变量,c++,oop,C++,Oop,如何从类的嵌套类方法访问类属性 class Class1 { public: int attribute; void Method1() { class Class2 { public: void Method2() { //here I need to access attribute from Class1 }

如何从类的嵌套类方法访问类属性

class Class1
{
public:
    int attribute;
    void Method1() { 
        class Class2
        {
            public:
               void Method2() { 
                   //here I need to access attribute from Class1
               }
        };
    }
};

您可以将
传递给内部类。例如:

class Class1
{
public:
    Class1() : class2(this) {
    }

    int attribute;
    void Method1() { 
    };

    class Class2
    {
        Class1 *parent;
    public:
        Class2(Class1 *parent) : parent(parent) {
        }
        void Method2() { 
             // parent->attribute
        }
   } class2;
};

下面是对OP的代码进行细微更改的一种方法

#include <cassert>

class Class1
{
    public:
        Class1( int attribute ) : attribute_( attribute ) {
        }
        void Method1() { 
            class Class2
            {
                public:
                    Class2( Class1 * parent ) : parent_( parent ) {
                    }
                    int parentAttribute() const { 
                        return parent_->attribute_;
                    }
                private:
                    Class1 * parent_;
            };
            Class2 c2( this );
            assert( c2.parentAttribute() == attribute_ );
        }
    private:
        int attribute_;
};

int main() {
    Class1 c1( 42 );;
    c1.Method1();
}
#包括
一班
{
公众:
Class1(int属性):属性(attribute){
}
void Method1(){
二级
{
公众:
类别2(类别1*家长):家长(家长){
}
int parentAttribute()常量{
返回父项->属性;
}
私人:
第1类*家长;
};
第2类c2(本);
断言(c2.parentAttribute()==attribute);
}
私人:
int属性;
};
int main(){
类别c1(42);;
c1.方法1();
}

代码也发布在

可能重复的上,我会将此作为方法参数传递,或者在构建
Class2
@refp时传递:您建议的链接有点不同。在
Class2::Method2()内部,您需要一些全局访问器函数来查找Class1的
this
,这样您就可以访问它的public属性了。或者,您可以将
Class1
这个
传递给
Class2
,作为
Class2
构造函数的一部分,这样它就知道它的父对象是谁,这样它就可以访问
Class1
的公共属性。@MM。它归结为同一件事。
Class1
始终使用
Class2
,这既没有显示也没有指定。如果没有该规范,Class1就不需要总是在
Class1
的构造上初始化
Class2
。但是这两种方法是完全不同的。否?为什么我不能在另一个方法中声明包含方法的类?我这样做了,它工作了。这只是一个如何调用父方法的示例。他可以用临时的
Class2
对象来完成它。@MM。谢谢我以前从未这样做过,这是我今天学到的:-)