如何初始化作为另一个类的成员变量的基类对象?

Posted

技术标签:

【中文标题】如何初始化作为另一个类的成员变量的基类对象?【英文标题】:How to initialize base class objects which are member variable of another class? 【发布时间】:2019-09-08 11:14:57 【问题描述】:

我想不出一个不言自明的简短标题,这是我的问题。 我有一个基类(Piece)和派生类(Pawn)。为了创建 Piece 对象,我使用参数调用派生类的构造函数。它工作正常。但是现在,我正在定义另一个名为 Board 的类,并且该类将包含 Piece 对象数组。 问题是,我想创建一个 Board 对象,但不知道如何在其中正确初始化基类对象。因为我曾经使用派生类构造函数初始化基类对象,但现在我没有那个选项。 Board类的构造函数怎么写?

class Piece 
public:
    Coordinates coor;
    whose color;                                 
    Piece(Coordinates a, enum whose c, char n); 
;

class Pawn : public Piece 
public:
    Pawn(Coordinates a, enum whose c, char n) :Piece(a, c, n)
;

class Board 
private:
    Piece node[32]; 

public:
    Board(); //How to write the constructor? 
    void show_board();

;

【问题讨论】:

我不认为 Board 是 Pieces 的矩阵 - 如果有的话,它是 Squares 的矩阵。另外,为什么是 9x9? @NeilButterworth 你是对的。我的错。我应该创建正方形矩阵。无论如何,我仍然想在一个 Board 对象中创建 32 Piece 对象。问题保持不变:) 我编辑了问题,而不是矩阵,现在有一个包含 32 个元素的一维数组。而 9x9 只是一种偏好,还有一些未使用的位。也许我将来会改变它。 ***.com/q/8462895/1216776 【参考方案1】:

首先,如果要存储派生对象,则不能声明基类型对象数组。你最终会得到Object Slicing。

为了解决你需要存储一个指向基类对象的指针数组:

Piece *board[9][9]; 

并在构造函数中初始化,例如:

Board::Board() : board() // this initializes all slots of "board" to nullptr.

   // create new Piece or derived objects in the array slots you want
   board[4][2] = new Pawn(x1, y1, z1);
   board[7][0] = new Pawn(x2, y2, z2);
   ...

【讨论】:

以上是关于如何初始化作为另一个类的成员变量的基类对象?的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

我无法访问我的基类的受保护成员

protectedpublicprivate

可以通过[重复]在派生类中初始化受保护的基类成员

在成员数据中使用模板参数的模板类的基类指针