char类型与char类型的不兼容分配[9]

时间:2013-09-13 03:52:25

标签: c++

我不能为我的生活找出为什么我收到此错误消息

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

2 个答案:

答案 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,这意味着第二个索引必须介于03之间。然而,您正试图在界限范围内访问它,如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()进行索引检查。