大家来看看>第三版中关于嵌套类解释的一个小错误

时间:2022-10-22 04:15:26
第552页有这段描述:
  除非外围类被声明为嵌套类的友元,否则它没有权利访问嵌套类的私有成员(这句话是正确的),
  大家来看看下句:嵌套类也没有任何特权访问其外围类的私有成员。(这句话就错了,实际上嵌套类可以访问外部类的私有成员,而且外部类不用把嵌套类声明为友元)。看下面的代码,在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++的利益与安全。

#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.

#7


05年整理的C++标准草案

#8


还有没有要发言的?

#1


这个以前也有人问过,这个问题好像没解决,个人认为楼主的想法是正确的

#2


编译器对类域的解析不同。这个在vc6里面就无法通过。

#3


VC6中测试符合它的叙述。

#4


小结:除非外部类被声明为嵌套类的友元,否则外部类没有权利访问嵌套类的私有成员;但嵌套
类却可以任意访问外部类的私有成员

#5


楼主的做法是很不规范的,VS(或VC)不符合规范的做法早就罄竹难书了,这里就是另一个佐证。
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.

#7


05年整理的C++标准草案

#8


还有没有要发言的?