2013-05-12 2 views
1

Каков правильный способ инициализации экземпляра объекта в матрице структуры?Каков правильный способ инициализации экземпляра объекта в матрице структуры?

Моему конструктору Cita(int, int) нужны два параметра для создания нового экземпляра, но когда я скомпилирую программу, моя оболочка сказала мне, что мне нужно скомпилировать с -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; 
    } 
    . 
    . 
+0

Это только предупреждение. Ошибка говорит, что вам нужно добавить '#include ' в верхней части файла. –

ответ

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.

+0

Я не использовал список, и мне не разрешено использовать этот параметр компиляции «std = C++ 0x» – ealch

0

Правильный способ инициализации временного класса POD - включить поддержку C++ 11 и включить <initializer_list>, как говорит компилятор. Но вы говорите, что по какой-то причине вам не разрешено использовать современный C++, так что вам придется делать это нелегко.

Один Possiblity, чтобы дать 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)))); 

Ни один из этих вариантов не идеальны, поэтому равномерная инициализация была добавлена ​​к языку. Вы должны попытаться убедить любого, кто запрещает вам использовать современный язык, чтобы расслабиться и воспользоваться его преимуществами.

Смежные вопросы