【问题标题】:Class member privacy and headers in C++C++ 中的类成员隐私和标头
【发布时间】:2011-12-11 10:51:07
【问题描述】:

所以我正在创建一个类来定义 D&D 中的角色。我认为设置类的方式是公共成员在标题中定义,在 .cpp 中定义为私有成员,因此它们不会向外界透露,对吗?你怎么做到这一点?目前它看起来像这样,我确定它是错误的。

字符.h:

namespace d20 {
    class character {
    public:
        character(void);
        virtual ~character(void);

        // get stats
        int getStr();
        int getDex();
        int getCon();
        int getIntl();
        int getWis();
        int getCha();

        // get modifiers of the stats
        int getStrMod();
        int getDexMod();
        int getConMod();
        int getIntlMod();
        int getWisMod();
        int getChaMod();
    };
};

character.cpp:

namespace d20 {
    class character {
    private:
        int str;    // strength
        int dex;    // dexterity
        int con;    // constitution
        int intl;   // intelligence
        int wis;    // wisdom
        int cha;    // charisma

        int hp;     // hit points
        int ac;     // armor class
    };
    character::character(void) {

    }

    character::~character(void) {

    }
}

是的,我知道有很多东西不见了,但这不是重点。 Visual Studio 2010 在类视图中将其显示为 2 个名为 character 的类。我如何完成我的意图?这无关紧要,因为它是一项任务,并且所有代码无论如何都是可见的,但是对于未来,将私有成员排除在 .h 文件之外可能是明智之举吗?

【问题讨论】:

  • 就像我说的,我知道少了很多东西。虽然为什么具体不会编译?我很好奇。

标签: c++ oop private-members access-specifier


【解决方案1】:

只需将private 成员放在同一个头文件中即可。根据设计,类定义不能分布在不同的文件中。

您为什么要首先阻止那些private 成员被客户看到?作为private,无论如何都无法直接访问它们。

编辑:

那些私有成员是类的实现细节。它们必须在类的定义中,因为有时编译器需要知道类对象的大小:

int main()
{
  character ch;

  // pass by value
  Func(ch);
  ..
}

在上面的例子中,编译器无法知道ch的大小,除非它看到character的定义,并且它可以通过查看类定义来计算大小!这就是为什么需要将实现放在类定义中的原因之一。

【讨论】:

  • 没错,任何私有函数都不需要在标题中定义...
  • 私有成员函数也必须在类定义中“声明”。尽管如果您愿意,它们可以在不同的源文件中“定义/实现”。
【解决方案2】:

将这些私有声明移到头文件中可能是个好主意。

private:
    int str;    // strength
    int dex;    // dexterity
    int con;    // constitution
    int intl;   // intelligence
    int wis;    // wisdom
    int cha;    // charisma

    int hp;     // hit points
    int ac;     // armor class

【讨论】:

    【解决方案3】:

    您首先声明了 2 个类。

    .h 中的一个和 .cpp 中的 1 个具有相同的名称。你认为它甚至会编译吗? 此外,将事物设为私有意味着其他类和那里的对象将无法访问它。 & 你认为如果一个人可以这样看到你的.h,他就看不到你的 .cpp 了吗?

    .h & .cpp 不是独立的东西。他们终于形成了一个单一的实体。在编译期间,所有头文件内容都合并到 .cpp 文件中。 & 所有的 .cpp 最终变成一个 dll 或 exe 或机器可以理解和运行的东西。 .h 的形成只是为了使代码更干净。

    在标题中将其设为私有,这样会更干净。

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 2013-07-07
      • 2010-09-17
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多