// 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的朋友。我已经解决了这个问题。

但是,新问题是我在People.h中包含了PhysicalTraits.h,在PhysicalTraits.h中包含了People.h。因此,在编译PhysicalTraits.h时,在定义PhysicalTraits对象之前,它将跳转到People对象的定义,这需要定义PhysicalTraits对象。

在仍然确保Me类型的对象无法访问traits.age的同时,如何避免出现“包含互惠”问题?

最佳答案

您不必在People.h中包含PhysicalTraits.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++ - 有选择地隐藏类(class)成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44676910/

10-11 00:26