如何在c ++中将类放在一起?

时间:2013-02-21 19:37:20

标签: c++ class object struct orientation

我的任务是编写一个代表骑士(名称,级别,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];
};

3 个答案:

答案 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 itemitem命名完全相同的类型; C ++没有C语言的类型和结构标记之间的分离。

有关详细信息,请参阅C ++ 11标准的第9节(或免费提供的n3337 final working draft)。特别是, 9.1班级名称始于:

  

类定义引入了一种新类型。 [实施例:

struct X { int a; };

接下来解释一下,这个声明将类名引入范围,根据struct X是否在范围内,明确说明X本身的含义等等。

稍后将在 11成员访问控制 11.2基类和基类成员的可访问性中讨论structclass之间的差异:

  

默认情况下,使用关键字class定义的类的成员是私有的。使用关键字struct或union定义的类的成员默认是公共的。

...

  

如果没有基类的 access-specifier ,则在使用 class-key struct定义派生类时会假定为public使用 class-key class定义类时,假定为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关键字声明。

但是,语法classstruct仅隐式更改成员和父类型的默认可见性(class隐式privatestruct public })。