除非外围类被声明为嵌套类的友元,否则它没有权利访问嵌套类的私有成员(这句话是正确的),
大家来看看下句:嵌套类也没有任何特权访问其外围类的私有成员。(这句话就错了,实际上嵌套类可以访问外部类的私有成员,而且外部类不用把嵌套类声明为友元)。看下面的代码,在vs2003下通过测试:
//NestedClass.cpp
/***********************************************************************************************************
** 嵌套类
**********************************************************************************************************/
#include <iostream>
#include <string>
using namespace std;
class List {
public:
enum ListStatus {Good,Empty,Corrupted};
//构造函数
List(ListStatus status) : currentStatus(status) {}
//打印当前状态
void printStatus()
{
ListItem item;
//外部类只能访问嵌套类的公有成员
cout << "List当前内部状态:" << item.checkListStatus(*this) << endl;
}
private:
//定义嵌套类
class ListItem {
//private:
public:
string checkListStatus(const List &list) //该方法必须是公有的,否则外部类无法访问!可以试试把它改成私有的
{
test();
ListStatus status = list._currentStatus(); //嵌套类可以调用外部类的私有方法和私有成员!
//ListStatus status = list.currentStatus; //ok
switch(status)
{
case Good:
return "成功!";
case Empty:
return "为空!";
case Corrupted:
return "已遭破坏!";
default:
return "未知!";
}
}
};//嵌套类定义结束
private:
//List的私有方法
ListStatus _currentStatus() const
{
return currentStatus;
}
static void test()
{
cout << "不管外部类的私有方法是静态的还是非静态的,嵌套类都可以访问!" << endl;
}
//List的私有成员
ListStatus currentStatus;
};
void main()
{
cout << "**********************c++嵌套类相关*********************" << endl;
List list(List::Good);
list.printStatus();
}
8 个解决方案
#1
这个以前也有人问过,这个问题好像没解决,个人认为楼主的想法是正确的
#2
编译器对类域的解析不同。这个在vc6里面就无法通过。
#3
VC6中测试符合它的叙述。
#4
小结:除非外部类被声明为嵌套类的友元,否则外部类没有权利访问嵌套类的私有成员;但嵌套
类却可以任意访问外部类的私有成员
类却可以任意访问外部类的私有成员
#5
楼主的做法是很不规范的,VS(或VC)不符合规范的做法早就罄竹难书了,这里就是另一个佐证。
C++不同于Java;类的私有成员及私有成员函数对第三方类(无论是父类、子类、外部类还是内嵌类)都是不可兼得,但且仅当该类声明为友元时,才开放其操作权限,这样做看起来是使用不方便,但却最大限度的保证了代码的安全性。减少了不必要的限制符的大量使用,使代码更直观更清晰。
微软编译器在底层上喜欢使用其超级强大的宏处理机制,VB、VC、VJ都源于使用这种东西,因此在考虑兼容Java的时候,自然就牺牲了C++的利益与安全。
C++不同于Java;类的私有成员及私有成员函数对第三方类(无论是父类、子类、外部类还是内嵌类)都是不可兼得,但且仅当该类声明为友元时,才开放其操作权限,这样做看起来是使用不方便,但却最大限度的保证了代码的安全性。减少了不必要的限制符的大量使用,使代码更直观更清晰。
微软编译器在底层上喜欢使用其超级强大的宏处理机制,VB、VC、VJ都源于使用这种东西,因此在考虑兼容Java的时候,自然就牺牲了C++的利益与安全。
#6
我记得以前也是这么说的,嵌套类不能访问外围类的私有成员,不过刚翻了一下新的C++标准,供大家参考一下:
11.8 Nested classes [class.access.nest]
1 A nested class is a member and as such has the same access rights as any other member. The members of an enclosing
class have no special access to members of a nested class; the usual access rules (clause 11) shall be obeyed.
11.8 Nested classes [class.access.nest]
1 A nested class is a member and as such has the same access rights as any other member. The members of an enclosing
class have no special access to members of a nested class; the usual access rules (clause 11) shall be obeyed.
#7
05年整理的C++标准草案
#8
还有没有要发言的?
#1
这个以前也有人问过,这个问题好像没解决,个人认为楼主的想法是正确的
#2
编译器对类域的解析不同。这个在vc6里面就无法通过。
#3
VC6中测试符合它的叙述。
#4
小结:除非外部类被声明为嵌套类的友元,否则外部类没有权利访问嵌套类的私有成员;但嵌套
类却可以任意访问外部类的私有成员
类却可以任意访问外部类的私有成员
#5
楼主的做法是很不规范的,VS(或VC)不符合规范的做法早就罄竹难书了,这里就是另一个佐证。
C++不同于Java;类的私有成员及私有成员函数对第三方类(无论是父类、子类、外部类还是内嵌类)都是不可兼得,但且仅当该类声明为友元时,才开放其操作权限,这样做看起来是使用不方便,但却最大限度的保证了代码的安全性。减少了不必要的限制符的大量使用,使代码更直观更清晰。
微软编译器在底层上喜欢使用其超级强大的宏处理机制,VB、VC、VJ都源于使用这种东西,因此在考虑兼容Java的时候,自然就牺牲了C++的利益与安全。
C++不同于Java;类的私有成员及私有成员函数对第三方类(无论是父类、子类、外部类还是内嵌类)都是不可兼得,但且仅当该类声明为友元时,才开放其操作权限,这样做看起来是使用不方便,但却最大限度的保证了代码的安全性。减少了不必要的限制符的大量使用,使代码更直观更清晰。
微软编译器在底层上喜欢使用其超级强大的宏处理机制,VB、VC、VJ都源于使用这种东西,因此在考虑兼容Java的时候,自然就牺牲了C++的利益与安全。
#6
我记得以前也是这么说的,嵌套类不能访问外围类的私有成员,不过刚翻了一下新的C++标准,供大家参考一下:
11.8 Nested classes [class.access.nest]
1 A nested class is a member and as such has the same access rights as any other member. The members of an enclosing
class have no special access to members of a nested class; the usual access rules (clause 11) shall be obeyed.
11.8 Nested classes [class.access.nest]
1 A nested class is a member and as such has the same access rights as any other member. The members of an enclosing
class have no special access to members of a nested class; the usual access rules (clause 11) shall be obeyed.
#7
05年整理的C++标准草案
#8
还有没有要发言的?