1
#include <Fl/Enumerations.H>
class Color
{
    public:
        static Color amber () {return fl_rgb_color (255, 204, 0);}
        static Color lighter_gray () {return fl_rgb_color (40, 40, 40); }
        static Color light_gray () {return fl_rgb_color (179, 179, 179);}
        static Color gray () {return fl_rgb_color (100, 100, 100);}
        static Color light_blue () {return fl_rgb_color (107, 107, 255);}
        static Color white () {return FL_WHITE;}
        static Color off_white() { return fl_rgb_color(225, 225, 225); }
        static Color cream() { return fl_rgb_color(204, 236, 255); }
        static Color black () {return FL_BLACK;}
        static Color red () {return FL_RED;}
        static Color green () {return FL_GREEN;}
        static Color dark_green () {return fl_rgb_color (0, 169, 45);}
        static Color blue () {return FL_BLUE;}
        static Color background () {return FL_BACKGROUND_COLOR;}

        Color (const Fl_Color& c = Color::black ()) : fl_color_ (c) {}
        operator Fl_Color () const {return fl_color_;}
        void make_current () const;

    private:
        Fl_Color fl_color_;
};

これは、Fl/Enumerations.hからの重要な部分の抜粋です。

enum Fl_Color { // standard colors
  // These are used as default colors in widgets and altered as necessary
  FL_FOREGROUND_COLOR   = 0,
  FL_BACKGROUND2_COLOR  = 7,
  FL_INACTIVE_COLOR = 8,
  FL_SELECTION_COLOR    = 15,

  // boxtypes generally limit themselves to these colors so
  // the whole ramp is not allocated:
  FL_GRAY0      = 32,   // 'A'
  FL_DARK3      = 39,   // 'H'
  FL_DARK2      = 45,   // 'N'
  FL_DARK1      = 47,   // 'P'
  FL_BACKGROUND_COLOR   = 49,   // 'R' default background color
  FL_LIGHT1     = 50,   // 'S'
  FL_LIGHT2     = 52,   // 'U'
  FL_LIGHT3     = 54,   // 'W'

  // FLTK provides a 5x8x5 color cube that is used with colormap visuals
  FL_BLACK      = 56,
  FL_RED        = 88,
  FL_GREEN      = 63,
  FL_YELLOW     = 95,
  FL_BLUE       = 216,
  FL_MAGENTA        = 248,
  FL_CYAN       = 223,
  FL_DARK_RED       = 72,

  FL_DARK_GREEN     = 60,
  FL_DARK_YELLOW    = 76,
  FL_DARK_BLUE      = 136,
  FL_DARK_MAGENTA   = 152,
  FL_DARK_CYAN      = 140,

  FL_WHITE      = 255
};

#define FL_FREE_COLOR       (Fl_Color)16
#define FL_NUM_FREE_COLOR   16
#define FL_GRAY_RAMP        (Fl_Color)32
#define FL_NUM_GRAY     24
#define FL_GRAY         FL_BACKGROUND_COLOR
#define FL_COLOR_CUBE       (Fl_Color)56
#define FL_NUM_RED      5
#define FL_NUM_GREEN        8
#define FL_NUM_BLUE     5

FL_EXPORT Fl_Color fl_inactive(Fl_Color c);
FL_EXPORT Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg);
FL_EXPORT Fl_Color fl_color_average(Fl_Color c1, Fl_Color c2, float weight);
inline Fl_Color fl_lighter(Fl_Color c) { return fl_color_average(c, FL_WHITE, .67f); }
inline Fl_Color fl_darker(Fl_Color c) { return fl_color_average(c, FL_BLACK, .67f); }
inline Fl_Color fl_rgb_color(uchar r, uchar g, uchar b) {

  if (!r && !g && !b) return FL_BLACK;
  else return (Fl_Color)(((((r << 8) | g) << 8) | b) << 8);
}
inline Fl_Color fl_rgb_color(uchar g) {
  if (!g) return FL_BLACK;
  else return (Fl_Color)(((((g << 8) | g) << 8) | g) << 8);
}
inline Fl_Color fl_gray_ramp(int i) {return (Fl_Color)(i+FL_GRAY_RAMP);}
inline Fl_Color fl_color_cube(int r, int g, int b) {
  return (Fl_Color)((b*FL_NUM_RED + r) * FL_NUM_GREEN + g + FL_COLOR_CUBE);}

FL_COLOR列挙を返す静的クラス定義に関して、次のクラスで何が起こっているのかについて頭を悩ませることはできませんでした。Fl_ColorがどのようにColorクラスの知識を持ち、コンパイラがどのようにFl_ColorをColorに変換するのかを知ることができるのかわかりません。ColorにはFl_Colorへの暗黙の変換があることは知っていますが、変換が双方向に行われるとは思いませんでした。これはどのように作動しますか?コンパイラーはコンストラクターを呼び出して、最初のパラメーターとして戻り値を渡すだけですか?

4

4 に答える 4

3

allを返す静的メソッドColorは、への呼び出しの結果を返しfl_rgb_colorます。

fl_rgb_colorを返し、マークされていない単一のパラメーターコンストラクターを持ちFl_Color、constへの参照を取得するため、これは有効な暗黙の変換です。ColorexplicitFl_Color

の戻り値fl_rgb_colorは一時的なものですがColor、参照Fl_Colorによってパラメーターconstを受け取るため、一時的なものをコンストラクターパラメーターにバインドすることは合法です。その存続期間は、Colorオブジェクト(それ自体も戻り値の一時的なもの)の構築が完了するまで続きます。

于 2009-12-03T18:55:57.323 に答える
0

戻る前に、F1_colorでColorコンストラクターを暗黙的に実行します

于 2009-12-03T18:53:50.603 に答える
0

ColorのコンストラクターはFl_Colorパラメーターを受け取るため、コンパイラーはそれを暗黙的に使用して、必要に応じてFl_ColorをColorに変換します。これは、単一のパラメーターを取り、明示的なキーワードでマークされていないC++コンストラクターの通常の動作です。

于 2009-12-03T18:55:43.297 に答える
0

Fl_Colorは暗黙的にに変換可能です。これは、パラメーターとして受け取る非明示的なコンストラクターがあるColorためです。ColorFl_Color

于 2009-12-03T18:56:08.837 に答える