在struct矩阵中初始化对象实例的正确方法是什么?

时间:2013-05-12 04:51:19

标签: c++ object matrix constructor struct

在struct的矩阵中初始化对象实例的正确方法是什么?

我的构造函数Cita(int, int)需要两个参数来创建一个新实例,但是当我编译程序时,我的shell告诉我必须使用-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>

这是我的代码..

Dia.cpp

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

Dia.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; 
    } 
    .
    .

2 个答案:

答案 0 :(得分: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进行编译。

答案 1 :(得分:0)

初始化临时POD类的正确方法是启用C ++ 11支持并包含<initializer_list>,正如编译器所说。但是你说你出于某种原因不允许使用现代C ++,所以你必须这么做。

一种可能性是给hora_dia一个构造函数:

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))) );

这些选项都不是理想选择,这就是为语言添加统一初始化的原因。你应该试着说服那些禁止你使用现代语言来放松和接受其好处的人。