2016-12-27 12 views
-1

У меня возникли проблемы с использованием конструкторов Struct ниже. В частности, те, которые имеют параметр типа Color_type.Что такое намерение конструктора Параметры типа внутреннего enum ?: код из принципов и практики программирования с использованием C++

Это мое понимание того, что с enumColor_type определяется в structColor обеспечивая то, казалось бы, что может быть доступна как Color::Color_type::red, но это не работает, когда я называю конструктор с таким значением, например, Color p{Color::Color_type::red};

Я смущен насчет намерения иметь этот enum в пределах struct и предоставить конструкторы с параметрами этого типа. Как бы построить этот объект для доступа к этим определениям типов?

бы лучшим решением будет использовать контекстными enum class за пределами struct, который называется так же, таким образом, что она предоставляет средства для вызова конструктора, как Color p{Color::Color_type::red};

Те же вопросы распространяться на enum Transparency, а также.

Это Snippit библиотеки grapics предоставленной Бьярне Страуструп в своей книге, Принципы программирования и практики с использованием C++ 2e

struct Color { 

    enum Color_type { 
      red=FL_RED, blue=FL_BLUE, green=FL_GREEN, 
      yellow=FL_YELLOW, white=FL_WHITE, black=FL_BLACK, 
      magenta=FL_MAGENTA, cyan=FL_CYAN, dark_red=FL_DARK_RED, 
      dark_green=FL_DARK_GREEN, dark_yellow=FL_DARK_YELLOW, dark_blue=FL_DARK_BLUE, 
      dark_magenta=FL_DARK_MAGENTA, dark_cyan=FL_DARK_CYAN 
      }; 
    enum Transparency { invisible = 0, visible=255 }; 

    Color(Color_type cc) :c(Fl_Color(cc)), v(visible) { } 
    Color(Color_type cc, Transparency vv) :c(Fl_Color(cc)), v(vv) { } 
    Color(int cc) :c(Fl_Color(cc)), v(visible) { } 
    Color(Transparency vv) :c(Fl_Color()), v(vv) { } 

    int as_int() const { return c; } 
    char visibility() const { return v; } 
    void set_visibility(Transparency vv) { v=vv; } 

    private: 
    unsigned char v;  // 0 or 1 for now 
    Fl_Color c; 
}; 
+3

Вы можете использовать 'Color :: red' вместо' Color :: Color_type :: red'. –

ответ

0

С помощью этого Comment я смог еще один тест и обнаружить, что Color test{Color::red}; действительно компилируется.

Непосредственная ошибка, которую я получал, заключалась в использовании объявления using в определении класса для наследования конструкторов базового класса.

Один из членов этого класса был типа Color, и он жаловался на использование конструктора, который был неявно удален из-за плохо сформированного определения.

Он был плохо сформирован, потому что Color::Color_type не был определен в рамках класса, который я определял. Когда я полностью квалифицирую тип с содержащим пространством имен, я смог скомпилировать его.

namespace 
{ 
struct Color { // Same as before} 

struct Striped_rectangle : Rectangle // details ommitted for Rectangle 
{ 
using Rectangle::Rectangle; 
// details ommited 
private: 
Color stc{Color::Color_type::red}; 
} 

Оба следующих инициализаций для члена stcStriped_rectangle в скомпилируется: Color stc{Graph_lib::Color::red}; и Color stc{Graph_lib::Color::Color_type::red};