0

我一生都无法弄清楚为什么会收到此错误消息

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';
    }
}
4

2 回答 2

6

您声明room为 3Dchar元素数组。因此,为了访问实际char的 s,您必须将三个索引应用于room. 得到它?三维数组需要三个索引来访问单个元素。例如,room[i][j][k]会给你访问相应的字符。

但是,如果您只对房间应用两个索引,如 中room[i][4],您将得到一维数组作为结果。因此,在room[i][4] = 'E'您尝试分配'E'给 1D 类型的数组时char[9]。那是没有意义的。那是你的问题。

为什么只使用两个索引?声明room为 3D 数组有什么意义?你想做什么?

此外,您的数组的第二个大小仅为4,这意味着第二个索引必须位于0and之间3。然而,您正试图越界访问它,如room[i][9].

于 2013-09-13T03:56:12.810 回答
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;

我不愿意让一个 m_ 像那样暴露,但没有真正的理由不这样做。

如果您不能使用 std::array,只需将 m_columns 的定义更改为

Column m_columns[9];

m_rows 和 m_floors 以此类推,但您可能希望对 floor()、row() 和 column() 进行索引检查。

于 2013-09-13T04:55:42.623 回答