Конфиденциальность членов класса и заголовки в C ++ - PullRequest
1 голос
/ 20 октября 2011

Итак, я делаю класс для определения персонажа в 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 ]

4 голосов
/ 20 октября 2011

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

Почему вы хотите, чтобы клиенты private не видели этих клиентов? Будучи private, к ним нельзя получить прямой доступ.

Edit:

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

int main()
{
  character ch;

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

В приведенном выше примере компилятор не может узнать размер ch, если не видит определение character, И он может определить размер, посмотрев на определение класса! Это одна из причин, почему вам нужно поместить реализации в определение класса.

1 голос
/ 20 октября 2011

Может быть хорошей идеей переместить эти частные объявления в заголовочный файл.

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
0 голосов
/ 20 октября 2011

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

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

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

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

...