我不能为我的生活找出为什么我收到此错误消息
incompatible types in assignment of `char' to `char[9]'
代码:
class CabinAssignment {
char room[3][4][9];
public:
CabinAssignment();
void display();
bool available(int floor, int row, int col);
void assignCabin(int floor, int row, int col);
};
CabinAssignment::CabinAssignment() {
for(int i = 0;i<3;i++) {
room[i][0] = 'A';
room[i][1] = 'B';
room[i][2] = 'C';
room[i][3] = 'D';
room[i][4] = 'E';
room[i][5] = 'F';
room[i][6] = 'G';
room[i][7] = 'H';
room[i][8] = 'I';
room[i][9] = 'J';
}
}
答案 0 :(得分:6)
您将room
声明为char
元素的3D数组。因此,为了访问实际的char
,您必须将三个索引应用于room
。得到它? 三个 - 维数组需要三个索引,用于单个元素访问。例如,room[i][j][k]
将允许您访问相应的字符。
但是,如果只将两个索引应用于空间,就像在room[i][4]
中一样,那么您将获得一维数组作为结果。因此,在room[i][4] = 'E'
中,您尝试将'E'
分配给char[9]
类型的1D数组。这没有意义。那是你的问题。
为什么你只使用两个指数?将room
声明为3D数组有什么意义?你想做什么?
此外,数组的第二个大小仅为4
,这意味着第二个索引必须介于0
和3
之间。然而,您正试图在界限范围内访问它,如room[i][9]
。
答案 1 :(得分:1)
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;
我并不愿意像这样曝光,但没有真正的理由不这样做。
如果您无法使用std :: array,只需更改,例如, m_columns to
Column m_columns[9];
对于m_rows和m_floors,等等,但是你可能想要对floor(),row()和column()进行索引检查。