访问周围 class 的私有成员
Accessing private members of surrounding class
我有两个 类 这样的:
#include <iostream>
class A {
public:
class B {
public:
void printX(void) const { std::cout << A::x << std::endl; }
};
private:
int x;
};
显然这段代码不起作用,因为B
无法访问x
,但是有没有办法让它起作用?
我试过在 类 中使用 friend class
关键字,如下所示:
class A {
public:
class B {
public:
friend class A;
void printX(void) const { std::cout << A::x << std::endl; }
};
friend class B;
private:
int x;
};
但是也没用,不知道有没有可能。
错误消息应该告诉您,A::x
不是静态成员,因此您需要一个 对象实例 才能访问它。如果将对 A
实例的引用添加到 B::A
,则可以使用它来访问 A::x
.
例如下面的作品:
class A {
public:
class B {
public:
B(A const& a) : a(a) {}
void printX(void) const { std::cout << a.x << std::endl; }
private:
A const& a;
};
private:
int x;
};
请注意,使用引用成员有几个含义。值得注意的是,您现在不能再重新分配 A::B
类型的实例,其实例也不可移动。因此,在 A::B
中保存 指针 而不是对 A
的引用通常更方便。无论哪种方式,您都需要确保 A::B
的实例不会超过它们引用的 A
实例,否则您最终会得到一个悬空引用。
根据 C++ 17 标准(14.7 嵌套 classes)
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
14) shall be obeyed.
所提供代码的问题是 x
不是 class A
的静态数据成员。您需要提供 class A
的对象,其数据成员 x
将在嵌套 class.
的对象中访问
例如
class A {
public:
class B {
public:
void printX( const A &a ) const { std::cout << a.x << std::endl; }
};
private:
int x;
};
A::B().printX( A() );
我有两个 类 这样的:
#include <iostream>
class A {
public:
class B {
public:
void printX(void) const { std::cout << A::x << std::endl; }
};
private:
int x;
};
显然这段代码不起作用,因为B
无法访问x
,但是有没有办法让它起作用?
我试过在 类 中使用 friend class
关键字,如下所示:
class A {
public:
class B {
public:
friend class A;
void printX(void) const { std::cout << A::x << std::endl; }
};
friend class B;
private:
int x;
};
但是也没用,不知道有没有可能。
错误消息应该告诉您,A::x
不是静态成员,因此您需要一个 对象实例 才能访问它。如果将对 A
实例的引用添加到 B::A
,则可以使用它来访问 A::x
.
例如下面的作品:
class A {
public:
class B {
public:
B(A const& a) : a(a) {}
void printX(void) const { std::cout << a.x << std::endl; }
private:
A const& a;
};
private:
int x;
};
请注意,使用引用成员有几个含义。值得注意的是,您现在不能再重新分配 A::B
类型的实例,其实例也不可移动。因此,在 A::B
中保存 指针 而不是对 A
的引用通常更方便。无论哪种方式,您都需要确保 A::B
的实例不会超过它们引用的 A
实例,否则您最终会得到一个悬空引用。
根据 C++ 17 标准(14.7 嵌套 classes)
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 14) shall be obeyed.
所提供代码的问题是 x
不是 class A
的静态数据成员。您需要提供 class A
的对象,其数据成员 x
将在嵌套 class.
例如
class A {
public:
class B {
public:
void printX( const A &a ) const { std::cout << a.x << std::endl; }
};
private:
int x;
};
A::B().printX( A() );