Моя задача — написать класс, который представляет рыцаря (имя, уровень, xp), и он может иметь максимум 10 предметов (это должен быть другой класс) (item_name, value)
Итак, я хотел бы сделать что-то подобное, но с классами, как я могу это сделать?
struct item
{
char itemName[21];
int value;
};
struct knight
{
char name[21];
int xp;
int level;
struct item cucc[10];
};
Как я могу поместить классы друг в друга в C ++?
Ну, просто вложите их, если вы это имеете в виду:
struct knight
{
struct item
{
char itemName[21];
int value;
};
char name[21];
int xp;
int level;
item cucc[10]; // Notice, that the struct keyword isn't necessary here
};
ОБНОВИТЬ: (подумав немного лучше о вопросе, который вы на самом деле хотел спросить)
Итак, я хотел бы сделать что-то подобное, но с классами, как я могу это сделать?
Прежде всего, struct
Это классы в C ++. Но то, что вы имеете в виду, вероятно, «Как мне инкапсулировать эти данные в классы и установить между ними направленную связь?»
В этом случае я бы пошел на что-то вроде этого:
class item
{
public:
// The constructor to set an item's name and value
item(std::string name, int value);
// Supposing your item's names and values don't change,
// so only getters on the class's interface
std::string get_name() const;
int get_value() const;
private:
// Member variables are private (encapsulated).
std::string itemName;
int value;
};
// Skipping member function definitions. You should provide them.
class knight
{
public:
// The constructor to set a knight's name
knight(std::string name);
// Supposing the name is unchangeable, only getters on the interface
std::string get_name() const;
// ...
// What goes here very much depends on the logic of your application
// ...
private:
std::string name;
int xp;
int level;
std::vector<item> cucc; // If you need reference semantics, consider
// std::vector<std::shared_ptr<item>> instead
};
// Skipping member function definitions. You should provide them.
Итак, я хотел бы сделать что-то подобное, но с классами, как я могу это сделать?
У тебя уже есть. struct
Ключевое слово определяет класс в C ++, так же как class
ключевое слово делает; единственное отличие состоит в том, что видимость по умолчанию является общедоступной, а не частной для классов, представленных struct
,
Также обратите внимание, что после item
определение класса, struct item
а также item
назовите точно такой же тип; В C ++ нет разделения между типами и тегами структуры, которые есть в C.
Смотрите раздел 9 стандарта C ++ 11 (или N3337 окончательный рабочий проект, который находится в свободном доступе) для деталей. Особенно, 9.1 Имена классов начинается с:
Определение класса вводит новый тип. [Пример:
struct X { int a; };
Далее поясняется, что это объявление вводит имя класса в область видимости, поясняя, что struct X
на свои средства в зависимости от того, X
находится в области и т. д.
Разница между struct
а также class
обсуждается позже в 11 член контроля доступа а также 11.2 Доступность базовых классов и членов базового класса:
Члены класса, определенного с помощью ключевого слова class, по умолчанию являются закрытыми. Члены класса, определенного с помощью ключевых слов struct или union, являются открытыми по умолчанию.
…
В отсутствие доступ спецификатор для базового класса public предполагается, когда производный класс определяется с класс-ключ
struct
и частный предполагается, когда класс определяется с класс-ключclass
,
Классы и структуры (я использую эти термины семантически, а не синтаксически — см. Ниже) могут быть произвольно вложены:
#include <string>
#include <array>
struct Knight {
struct Item {
std::string name;
int value;
};
std::string name;
int xp;
int level;
std::array<Item,10> cucc; // us an `std::vector` if the size is *not* fixed
};
Относительно классов: Есть очень мало различий между структурами и классами, синтаксически, но есть должен сделать различие в том, что вы намерены быть объектом. Если это просто совокупность данных, то концептуально это структура, и это следует указать с помощью struct
ключевое слово. Если это интеллектуальная структура данных и она управляет своими собственными закрытыми членами через функции-члены, то концептуально это класс, поэтому обычно она объявляется с class
ключевое слово.
Тем не менее, синтаксически class
а также struct
изменить только видимость по умолчанию для членов и родительских типов (class
косвенным образом private
, struct
косвенным образом public
).