有选择地隐藏类成员的成员
Selectively hide member of member of class
// PhysicalTraits.h
struct PhysicalTraits {
unsigned int age; // years
double height; // meters
PhysicalTraits(const double H = 0.0, const unsigned int A = 0u) : age (A), height(H) {};
~PhysicalTraits() {};
};
// People.h
#include <PhysicalTraits.h>
class People {
PhysicalTraits traits;
public:
People(const double H = 0.0, const double A = 0u) : traits(H, A);
~People() {};
void displayAge() { std::cout << "You are " << traits.age << " years old." << std::endl; }
void displayHeight() { std::cout << "You are " << traits.height << " meters tall." << std::endl; }
};
// Me.h
#include <PhysicalTraits.h>
class Me {
PhysicalTraits traits;
public:
Me(const double H = 0.0) : traits(H);
~Me() {};
void displayAge() {
// I want `traits.age` to throw an error
std::cout << "You are " << traits.age << " years old." <<
}
void displayHeight() {
std::cout << "You are " << traits.height << " meters tall." << std::endl;
}
};
我打算允许 People
类型的对象访问 traits.age
.但是,我不想知道我的年龄,所以我想限制 Me
类型的对象访问traits.age
。
为此,我修改了PhysicalTraits.h
:
#include <People.h>
struct PhysicalTraits {
double height; // meters
private:
unsigned int age; // years
friend class People; // Objects of type `People` can access age
};
将age
作为私有成员变量和People
的朋友,但不是Me
。我已经解决了问题...有点。
但是,新的问题是我在PhysicalTraits.h
中包含People.h
,在People.h
中包含PhysicalTraits.h
。因此,编译PhysicalTraits.h
时,在定义PhysicalTraits
对象之前,它将跳转到People
对象的定义,这需要定义PhysicalTraits
对象。
如何避免这种"相互包含"问题,同时仍然确保类型Me
的对象无法访问traits.age
?
您
不必在PhysicalTraits.h
中包含People.h
。那里不需要类People
的完整定义。您可以只声明该类。
PhysicalTraits.h
看起来像这样:
class People; // Forward declaration
struct PhysicalTraits {
double height; // meters
private:
unsigned int age; // years
friend class People; // Objects of type `People` can access age
};
创建前向声明正是为了解决像您这样的问题(相互包含(。在 c++ 中,您的代码(通常(是从上到下解析的,当您需要使用例如调用后定义的函数时,会产生很多问题。这就是实施宣言的原因。在您的情况下,编译器只需要知道类的名称,因此声明就足够了。但是,不能创建仅声明的类的对象或调用其任何方法。
同样值得注意的是,在可能的情况下使用声明可以加快编译速度,因为解析定义显然需要一些时间。
相关文章:
- 使用函数参数隐藏成员函数
- C++继承模板类:隐藏成员变量
- pImpl、范围和隐藏数据成员
- 有选择地隐藏类成员的成员
- 共享类时如何隐藏成员功能文件
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 在继承的类构造函数中使用隐藏成员
- 视觉C++:即使使用关键字,参数声明也会隐藏类成员"this"
- c 中的名称隐藏式成员功能:良好实践
- C 如何使用隐藏的默认构造函数初始化成员
- 隐藏PIMPL-Objects拥有的成员的实现
- 成员模板模板参数的隐藏
- 编译器不应该对派生类中隐藏的基本结构的成员变量发出警告吗?
- 是否应隐藏所有数据成员
- 隐藏C++成员函数的原因
- VS2012 - 类界面设计:私有成员函数定位/隐藏
- 有关隐藏超类成员的问题
- 如何在不授予私有成员访问权限的情况下隐藏 C++ 中的 STL 函子结构
- decltype和隐藏外部名称的类成员名称之间的交互
- C++类成员隐藏规则:设计问题