我的任务是编写一个代表骑士(名称,级别,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];
};
答案 0 :(得分:1)
如何在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.
答案 1 :(得分:1)
所以,我想做这样的事情,但是对于课程,我怎么能设法做到这一点?
你已经拥有了。 struct
关键字在C ++中定义了一个类,就像class
关键字一样;唯一的区别是对于struct
引入的类,默认可见性是公共的而不是私有的。
另请注意,在item
类定义后,struct item
和item
命名完全相同的类型; C ++没有C语言的类型和结构标记之间的分离。
有关详细信息,请参阅C ++ 11标准的第9节(或免费提供的n3337 final working draft)。特别是, 9.1班级名称始于:
类定义引入了一种新类型。 [实施例:
struct X { int a; };
接下来解释一下,这个声明将类名引入范围,根据struct X
是否在范围内,明确说明X
本身的含义等等。
稍后将在 11成员访问控制和 11.2基类和基类成员的可访问性中讨论struct
和class
之间的差异:
默认情况下,使用关键字class定义的类的成员是私有的。使用关键字struct或union定义的类的成员默认是公共的。
...
如果没有基类的 access-specifier ,则在使用 class-key
struct
定义派生类时会假定为public使用 class-keyclass
定义类时,假定为private。
答案 2 :(得分:0)
类和结构(我在语义上使用这些术语,而不是语法 - 见下文)可以任意嵌套:
#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
})。