#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类的定义是全局的,它就像我想要的那样工作。为什么这样做?
答案 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语句。函数的作用域是在编译后的目标文件中的单个翻译单元。你可以在函数中有一个空范围,因为它是有效的,但你不能声明 - 在另一个范围内定义一个函数。