Как спроектировать класс цвета, который уже имеет предопределенные стандартные цвета, наиболее элегантным способом на С ++? - PullRequest
4 голосов
/ 19 октября 2019

Как спроектировать класс Color, который уже предопределил стандартные цвета современным элегантным способом c ++? Я хотел бы знать минимальный пример дизайна, который делает это вместо полного класса цвета.

У меня есть базовый класс цвета:

class Colour
{
    public:
    double rgb[3];
};

Теперь я могу использовать его следующим образом:

Colour c1 = {1.0, 0.0, 0.0}, c2 = {1.0, 1.0, 0.0};

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

Colour c1 = Colour::Red, c2 = Colour::Yellow;

Как достичь вышеуказанного?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 19 октября 2019

С немного другим синтаксисом вы можете использовать статические функции-члены:

struct Colour {
    double rgb[3];

    static constexpr Colour Red() {
        return {1, 0, 0};
    }
};

auto red = Colour::Red();

В качестве альтернативы, вы можете поместить стандартные цвета в специальное пространство имен:

namespace Colours {
    inline constexpr auto Red = Colour{1, 0, 0};
}

auto red = Colours::Red;
2 голосов
/ 19 октября 2019

Если вы хотите предоставить конвертирующий конструктор в классе Colour, тогда вы можете определить стандартные цвета для массивов, а затем преобразовать их в объект Color во время создания.

#include <array>

struct Colour {
    Colour(std::array<double, 3> _rgb) : rgb(_rgb) {}

    std::array<double, 3> rgb;

    static constexpr auto Red = std::array<double, 3>{1.0, 0.0, 0.0};
    static constexpr auto Yellow = std::array<double, 3>{1.0, 1.0, 0.0};
};

Colour c1 = Colour::Red, c2 = Colour::Yellow;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...