Создание библиотеки образцов - PullRequest
1 голос
/ 25 июля 2010

Привет всем, я работаю над очисткой моего кода от предыдущих семестров.

Ранее я создал 151 библиотеку образцов цветов на С ++. Однако из-за моего нехватки времени и отсутствия опыта я создал его целиком как блок определений. Который, для жесткого кодирования значений в пятна работал нормально. Однако у этого подхода есть некоторые очевидные недостатки.

Что я планировал до сих пор, так это создание пространства имен 'swatch', и внутри пространства имен у меня будет перечисление допустимых цветов. У меня также была бы функция 'getSwatch', или что-то подобное, которая возвращала бы vec3 (мой класс представляет вектор из 3-х элементов с некоторой хорошей функциональностью), и функция использовала бы оператор switch для прохождения через действительные образцы.

Это будет выглядеть примерно так:

namespace swatch{

    enum color{
        red,
        blue,
        green
    }

    inline
    const vec3 getColor(const color& c){
        // Switch and return red blue or green.
    }
}

Мой вопрос: Я хотел бы знать, как вы могли бы предложить это сделать? Преимущества предварительной работы и удобства использования - это то, что меня больше всего интересует.

Заранее спасибо, друзья,

Удачного кодирования.

Редактировать: Я просто изменил пример, чтобы придать больше смысла людям, которые не знают, как я использую свой класс vec. (т.е. все, кроме меня). Кроме того, вы можете просто посмотреть на другие anwsers для использования. Они сделали правильное предположение о передаче значений rgb в конструктор, это не то, как я это сделал, но я все еще могу прекрасно следовать тому, что вы имеете в виду.

Ответы [ 2 ]

0 голосов
/ 26 июля 2010

Использовать справочную таблицу:

/************* .h *************/

enum color{
    red,
    blue,
    green,

    colors_count
}

const vec3 &getColor(color c)
{
    extern const vec3 colors_table[colors_count];
    return colors_table[c];
}

/************* .cpp *************/

extern const vec3 colors_table[colors_count] = {
    vec3(255, 0, 0), // red
    vec3(0, 0, 255), // blue
    vec3(0, 255, 0), // green
};

Вы ничего не написали о цели использования шаблонов, поэтому я просто исключил их. Если вы объясните больше, я, возможно, помогу.

// РЕДАКТИРОВАТЬ
Это очень просто и очень быстро.
В c ++ значения enum - это не просто идентификаторы, это числа. Если вы не укажете другое, они будут следующими числами, начиная с 0: «красный» - 0, «синий» - 1, «зеленый» - 2 и «colors_count» - 3 (см. http://www.google.com/search?q=c%2B%2B+enum). Вы можете использовать эти числа для индексации массива. Затем вы просто выбираете элемент из массива по указанному индексу.

0 голосов
/ 25 июля 2010

Вы можете просто использовать std :: map:

  class ColorClass {
  private:
    std::map<color, vec> colors;
    // ... etc ...

И тогда у вас есть большая функция инициализации, которая устанавливает его:

  colors["red"] = new vec(0xFF, 0x00, 0x00);
  colors["blue"] = new vec(0x00, 0xFF, 0x00);
  // ... etc ...

И тогда ваша функция getColor просто:

  return colors[color];

Готово!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...