如何在c ++中解决错误"表达式必须是可修改的左值"?

mac*_*ers 1 c++ visual-c++

const int ADJ_MATRIX[VERTEX_NUM][VERTEX_NUM]={   
                                                {0,1,1,0,0,0,0,0},
                                                {1,0,0,1,1,0,0,0},
                                                {1,0,0,0,0,1,1,0},
                                                {0,1,0,0,0,0,0,1},
                                                {0,1,0,0,0,0,0,1},
                                                {0,0,1,0,0,0,1,0},
                                                {0,0,1,0,0,1,0,0},
                                                {0,0,0,1,1,0,0,0}
                                            };

typedef struct {
    int vertex;
    int matrix[VERTEX_NUM][VERTEX_NUM];
    int vNum;
    int eNum;
}Graph;

void buildGraph(Graph *graph){
    graph->vNum = VERTEX_NUM;
    graph->eNum = EDGE_NUM;
    graph->matrix = ADJ_MATRIX;
}
Run Code Online (Sandbox Code Playgroud)

错误发生在这句话中:

graph->matrix = ADJ_MATRIX;
Run Code Online (Sandbox Code Playgroud)

我是c ++的新手.请告诉我为什么会出现这个问题以及如何解决?

我想将ADJ_MATRIX分配给矩阵struct.

R. *_*des 8

如前所述,您无法在C++中分配数组.这是因为编译器是一个意思,因为编译器可以.它只是不会让你这样做......

......除非你欺骗它;)

template <typename T, int N>
struct square_matrix {
    T data[N][N];
};

square_matrix<int, 10> a;
square_matrix<int, 10> b;
a = b; // fine, and actually assigns the .data arrays
a.data = b.data; // not allowed, compiler won't let you assign arrays
Run Code Online (Sandbox Code Playgroud)

抓到了吗?现在代码需要一些小东西:

const square_matrix<int, VERTEX_NUM> ADJ_MATRIX={{ 
                                               // blah blah
                                            }}; // extra set of braces

typedef struct {
    int vertex;
    square_matrix<int, VERTEX_NUM> matrix;
    int vNum;
    int eNum;
}Graph;

void buildGraph(Graph *graph){
    graph->vNum = VERTEX_NUM;
    graph->eNum = EDGE_NUM;
    graph->matrix = ADJ_MATRIX; // no change
}
Run Code Online (Sandbox Code Playgroud)

而要访问细胞,现在我们需要使用graph->matrix.data[1][2].这可以通过重载operator[]operator()for 来减轻square_matrix.但是,现在这已经非常接近新std::array类或Boost等价物boost::array,因此考虑这些可能是明智之举.


Sin*_*all 6

不幸的是(或者幸运的是,谁知道......)你不能只用C++将一个数组分配给另一个数组.

如果要复制数组,则需要将每个元素逐个复制到新数组中,或者使用以下memcpy()函数:

for( int i = 0; i < VERTEX_NUM; i++ )
    for( int j = 0; j < VERTEX_NUM; j++ )  
       graph->matrix[i][j] = ADJ_MATRIX[i][j];
Run Code Online (Sandbox Code Playgroud)

要么

memcpy( graph->matrix, ADJ_MATRIX, VERTEX_NUM * VERTEX_NUM * sizeof(int) );
Run Code Online (Sandbox Code Playgroud)