【问题标题】:What is the correct way to initialize an instance of an object within matrix of struct?在结构矩阵中初始化对象实例的正确方法是什么?
【发布时间】:2013-05-12 04:51:18
【问题描述】:

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

我的构造函数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; 
    } 
    .
    .

【问题讨论】:

  • 这些只是警告。错误提示您需要在文件顶部添加#include &lt;initializer_list&gt;

标签: c++ object matrix constructor struct


【解决方案1】:

在 C++98 中,initializer_list 不受支持,即不能使用列表 {..} 初始化向量或其他容器。

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

正如g++ 所说,添加#include &lt;initializer_list&gt; 并使用-std=c++0x 编译。

【讨论】:

  • 我没有使用列表,也不允许使用这个编译选项“std=c++0x”
【解决方案2】:

正如编译器所说,初始化临时 POD 类的正确方法是启用 C++11 支持并包含 &lt;initializer_list&gt;。但是你说由于某种原因你不允许使用现代 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))) );

这些选项都不是理想的,这就是为什么将统一初始化添加到语言中。您应该尝试说服禁止您使用现代语言的人放松并接受它的好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2011-08-20
    相关资源
    最近更新 更多