1

構造体の行列内でオブジェクトのインスタンスを初期化する正しい方法は何ですか?

私のコンストラクターCita(int, int)は新しいインスタンスを作成するために 2 つのパラメーターを必要としますが、プログラムをコンパイルすると、シェルはコンパイルする必要があると言いました-std=c++0x or -std=gnu++0xが、それを行うことは許可されていません。ここにエラーがあります..

Dia.cpp: In constructor ‘Dia::Dia(int, int, int)’: 
Dia.cpp:9:56: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
Dia.cpp:9:75: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] 
Dia.cpp:9:75: error: deducing from brace-enclosed initializer list requires #include <initializer_list>

そして、ここに私のコードがあります..

ダイヤ.cpp

horario_funcionarios = vector_horario_funcionarios (numero_funcionarios, 
  vector_horario(numero_horas, {true, Cita(0,0)}) );

ダイヤ.hpp

struct hora_dia { 
    bool habil; 
    Cita cita; 
}; 

typedef vector<hora_dia> vector_horario; 
typedef vector<vector_horario> vector_horario_funcionarios; 

class Dia { 
    private:  
        int id; 
        vector_horario_funcionarios horario_funcionarios; 
     .
     .
     .

Cita.cpp

    Cita::Cita(int id, int nivel) { 
         this->id = id;  
         this->nivel = nivel; 
    } 
    .
    .
4

2 に答える 2

1

C++98 では、initializer_list はサポートされていません。つまり、リストを使用してベクトルまたはその他のコンテナーを初期化することはできません{..}

horario_funcionarios = vector_horario_funcionarios (numero_funcionarios, 
  vector_horario(numero_horas, {true, Cita(0,0)}) );

言うようg++に、 を追加#include <initializer_list>してコンパイルし-std=c++0xます。

于 2013-05-12T05:06:13.940 に答える
0

<initializer_list>一時 POD クラスを初期化する正しい方法は、コンパイラが言うように、C++11 サポートを有効にして include することです。しかし、何らかの理由で最新の C++ を使用することは許可されていないため、難しい方法で行う必要があるとのことです。

hora_dia1 つの可能性は、コンストラクターを与えることです。

struct hora_dia { 
    hora_dia(bool habil, Cita cita) : habil(habil), cita(cita) {}
    //...
};

horario_funcionarios = vector_horario_funcionarios (numero_funcionarios, 
    vector_horario(numero_horas, hora_dia(true, Cita(0,0))) );

または、それが理にかなっている場合は、おそらくデフォルトのコンストラクター:

struct hora_dia { 
    hora_dia() : habil(true), cita(0,0) {}
    //...
};

horario_funcionarios = vector_horario_funcionarios (numero_funcionarios, 
    vector_horario(numero_horas) );

ただし、これは構造がもはや POD ではないことを意味し、これはあなたが望むものかもしれません。その場合、一時オブジェクトを使用できます。

hora_dia hd = {false, Cita(0,0)};
horario_funcionarios = vector_horario_funcionarios (numero_funcionarios, 
    vector_horario(numero_horas, hd) );

またはファクトリ関数:

hora_dia make_hora_dia(bool habil, Cita cita) {
    hora_dia hd = {habil, cita};
}

horario_funcionarios = vector_horario_funcionarios (numero_funcionarios, 
    vector_horario(numero_horas, make_hora_dia(true, Cita(0,0))) );

これらのオプションはどれも理想的ではありません。そのため、統一的な初期化が言語に追加されました。リラックスしてその利点を受け入れるために現代語を使用することを禁じている人を説得する必要があります。

于 2013-05-12T11:33:06.153 に答える