2

Я создал 2d-массив, называемый цифрами, и хотел бы инициализировать каждый из подмассивов один за другим, чтобы сделать код более понятным. Я понимаю, что следующий код работает:C++ пытается инициализировать значения в массиве 2d

string digits[2][5] = { { " - ","| |"," ","| |"," - " },{ " - ","| |"," ","| |"," - " } }; 

Но мне интересно, почему следующее не работает:

string digits[2][5]; 
digits[0] = { " - ","| |"," ","| |"," - " }; 
digits[1] = { " - ", "| |", " ", "| |", " - " }; 
+0

Это назначение. Инициализировать список можно только для инициализации. –

ответ

2

2-я один не инициализации, это назначение (элементов digits).

string digits[2][5];        // initialization 
digits[0] = { " - ","| |"," ","| |"," - " };  // assignment of the 1st element of digits 
digits[1] = { " - ", "| |", " ", "| |", " - " }; // assignment of the 2nd element of digits 

Элемент digits представляет собой массив, сырой array не может быть назначен в целом.

Объекты типа массива не могут быть изменены в целом: несмотря на то, что они являются lvalues ​​(например, адрес массива может быть принято), они не могут появляться на левой стороне оператора присваивания

Вы можете сделать это с помощью std::array или std::vector, которые могут быть назначены с помощью принудительного инициализатора.

std::array<std::array<std::string, 5>, 2> digits; 
digits[0] = { " - ","| |"," ","| |"," - " }; 
digits[1] = { " - ", "| |", " ", "| |", " - " }; 
2

Инициализация далеко отличается от назначения. инициализация присваивает значение переменной при объявлении (вызывающий конструктор), тогда как назначение должно объявляться, а затем назначать (вызывать оператор присваивания). правильно назначить вам удалить скобки и затем использовать цикл или вручную, например:

#include <iostream> 
#include <string> 
using namespace std; 


int main() 
{ 
    string s[2][3]; 
    string Hi = "Hi there!"; 

    s[0][0] = "Hello there!"; 
    //.... 

    for(int i(0); i < 2; i++) 
     for(int j(0); j < 3; j++) 
      s[i][j] = Hi; 

    for(int i(0); i < 2; i++) 
     for(int j(0); j < 3; j++) 
      cout << s[i][j] << endl; 

    return 0; 
} 
1

Если вы изменяете эту линию для ясности, а также рассмотреть:

string digits[2][5] = { 
     {" - ", "| |", " ", "| |", " - "}, 
     {" - ", "| |", " ", "| |", " - "} 
    }; 

Примечание: Рассмотрим. Отступ является мощным инструментом, но его можно использовать неправильно.