Конфиденциальность членов класса и заголовки в 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 формируется просто для того, чтобы сделать код чище.
Сделайте это частным в заголовке, это будет более чистым.