char room[3][4][9];
说房间是 3 x 的数组
char[4][9];
这是一个 4 x 的数组
char[9];
这是一个由 9 个字符组成的数组。
room[i][0] = 'A';
正在尝试将单个 char 分配给实际上是 char[9] 的数组;
您可以使用 typedef 使这对自己更容易。
typedef char COLUMN;
typedef COLUMN ROW [9]; // A row has 9 columns
typedef ROW FLOOR [4]; // A floor has 4 rows.
char FLOOR room[3]; // this object has 3 floors of 4 rows or 9 columns
或者更好的是,您可以使用内联分类。
#include <array> // this lets you do std::array<type, size> but requires c++11
class CabinAssignment {
public:
class Column {
char m_value;
public:
Column(char value_ = 0) : m_value(value_) {}
char get() const { return m_value; }
void set(char value_) { m_value = value_; }
};
class Row {
std::array<Column, 9> m_columns;
public:
Row() : m_columns() {}
const Column& col(size_t colNo_) const { return m_columns[colNo_]; }
Column& col(size_t colNo_) { return m_columns[colNo_]; }
};
class Floor {
std::array<Row, 4> m_rows;
public:
Floor() : m_rows() {}
const Row& row(size_t rowNo_) const { return m_rows[rowNo_]; }
Row& row(size_t rowNo_) { return m_rows[rowNo_]; }
};
private:
std::array<Floor, 3> m_floors;
public:
CabinAssignment() : m_floors() {}
const Floor& floor(size_t floorNo_) const { return m_floors[floorNo_]; }
Floor& floor(size_t floorNo_) { return m_floors[floorNo_]; }
};
int main() {
CabinAssignment cab;
cab.floor(1).row(3).col(8) = 'A';
char whoseOnFloor2Row5Col1 = cab.floor(2).row(5).col(1).get();
}
最后有多种方法可以消除“get()”,我试图使用一个主题。Charles Bailey 指出你可以使 Column 成为一个更简单的结构
struct Column { char value; }
接着
char whoseOnFloor2Row5Col1 = cab.floor(2).row(5).col(1).value;
不过,我已经养成了在成员变量前面加上“m_”的习惯,这样就可以了
struct Column { char m_value; }
char whoseOnFloor2Row5Col1 = cab.floor(2).row(5).col(1).m_value;
我不愿意让一个 m_ 像那样暴露,但没有真正的理由不这样做。
如果您不能使用 std::array,只需将 m_columns 的定义更改为
Column m_columns[9];
m_rows 和 m_floors 以此类推,但您可能希望对 floor()、row() 和 column() 进行索引检查。