我该怎么做才能访问对象的成员变量?

时间:2017-10-22 10:43:57

标签: c++

#include<iostream>
using namespace std;
int main(){
    class c1{
        int i;

        public:
        int bv;
        void seti(int i){
            c1::i=i;
                        }
        int geti(){return i;}
        int accessbv(c1 inst1);
    };
    int c1::accessbv (c1 inst1){
        cout<<"here in the base accesing inst1's bv"<<inst1.bv;
    }

我想访问inst1的成员变量bv。上面的代码没有编译。我该怎么办? 我也观察过一件事,如果c1类的定义是全局的,它就像我想要的那样工作。为什么这样做?

2 个答案:

答案 0 :(得分:2)

仅仅因为该类是本地的,并不意味着定义函数的规则会发生变化。 C ++标准甚至可以明确地说明它。

[class.local]/2,强调我的:

  

封闭式功能无法对本地成员进行特殊访问   类;它遵循通常的访问规则(Clause [class.access])。的会员   本地班级的职能应在其班级内定义   定义,如果它们被定义的话。

上面提到的“规则”只是标准的函数定义相关部分[dcl.fct.def.general]/2中所述的内容:

  

......只能在命名空间或类范围内定义函数。

就是这样。

答案 1 :(得分:1)

在这里扩展StoryTeller的答案是一个例子,通过你对他的答案的评论来解释它的含义:

  

你能否澄清第一个陈述&#34;封闭的功能对本地成员没有特殊的权限;它遵循通常的访问规则(Clause [class.access])。&#34;并添加一些关于其他功能规则中不允许的功能的内容。

void someFunc() {
    class foo {
    private:
        int x;
    public:
        int getX() const { return x; }
        void setX( int val ) { x = val; }
    };
}

此处foo是在someFunc()中声明的本地类。 someFunc的范围或正文无法访问foo的内部信息。由于上述功能已声明并且在foo范围内定义,这是有效的。

尝试这样做:

void someFunc() {
    class boo {
    private:
        int x;
    public:
        int getX() const;
        void setX( int val );
    };

    // These are illegal. You can not define a function within a function
    // even when they belong to a class.

    // These two functions can not be defined here because this is
    // considered re-declaring them out side of their class within local scope of a function. 
    // These will give you a compiler error: local function definitions are illegal
    int boo::getX() const { return x; }
    void boo::setX( int val ) { x = val; }
} 

导致编译器错误。

此处someFunc()无法通过其成员变量的范围解析运算符访问boo的范围。它无法访问boo::x

在函数中声明函数是不合法的,因为函数作用域的堆栈指针,这是无法完成的。功能不像是&amp; for循环或可以嵌套的switch语句。函数的作用域是在编译后的目标文件中的单个翻译单元。你可以在函数中有一个空范围,因为它是有效的,但你不能声明 - 在另一个范围内定义一个函数。