Конфиденциальность членов класса и заголовки в C++

Итак, я делаю класс для определения персонажа в D&D. Я думал, что при настройке класса публичные члены определены в заголовке, а приватные в.cpp, поэтому они не открыты для внешнего использования, верно? Как ты это делаешь? В настоящее время это выглядит так, и я уверен, что это неправильно.

character.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 класса с именем персонажа в представлении классов. Как мне сделать то, что я хотел? Это не имеет большого значения для этого, так как это назначение, и весь код в любом случае виден, но в будущем, вероятно, было бы разумно не допустить правильности закрытых членов в файле.h?

3 ответа

Решение

Просто положи private члены в одном заголовочном файле. Определение класса не может быть распределено по разным файлам.

Почему вы хотите предотвратить те private членов от того, чтобы их видели клиенты в первую очередь? бытие private, они не могут быть доступны напрямую в любом случае.

Редактировать:

Эти закрытые члены являются деталями реализации класса. Они должны быть в определении класса, потому что иногда компилятору нужно знать размер объектов класса:

int main()
{
  character ch;

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

В приведенном выше примере компилятор не может узнать размер ch если он не видит определение 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

Вы объявляете 2 класса в первую очередь.

один в.h & 1 в.cpp & с тем же именем. Как вы думаете, он будет даже компилироваться? Кроме того, создание вещи частной означает, что она не будет доступна другим классам и объектам. И как вы думаете, если человек увидит ваш.h таким образом, он не сможет увидеть ваш.cpp?

.h &.cpp не отдельная вещь. Они наконец формируют единую сущность. Во время компиляции все содержимое заголовка объединяется в файл.cpp. И все.cpp, наконец, в DLL или EXE-файл или что-то, что машина может понять и запустить..h формируется просто для того, чтобы сделать код чище.

Сделайте это частным в заголовке, это будет более чистым.

Другие вопросы по тегам