2

私はdigitsという2次元配列を作成しましたが、各サブ配列を1つずつ初期化してコードをより鮮明にしたいと考えています。私は、次のコードが動作することを理解:C++は2次元配列の値を初期化しようとしています

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

しかし、以下は動作しない理由を疑問に思って:

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

それは割り当てです。初期化リストは初期化のためのものです。 –

答えて

2

第二1は、それが(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全体として割り当てることができない、アレイです。配列型の

オブジェクトは全体として変更することはできません:彼らは は左辺値は(アレイのアドレスを取ることができるなど)、それらは が代入演算子の左側に表示されることができない場合であっても

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] = { 
     {" - ", "| |", " ", "| |", " - "}, 
     {" - ", "| |", " ", "| |", " - "} 
    }; 

注:を検討します。インデントは強力なツールですが、誤用される可能性があります。

関連する問題