Конструктор со ссылками не назначается правильно? - PullRequest
2 голосов
/ 10 августа 2009

Я пытаюсь написать простой цветовой класс, который должен быть максимально универсальным. Вот как это выглядит:

class MyColor {
private:
uint8 v[4];
public:
uint8 &r, &g, &b, &a;

MyColor() : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {}
MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {
    printf("%d, %d, %d, %d\n", red, green, blue, alpha);
    r = red;
    g = green;
    b = blue;
    a = alpha;
}
MyColor(uint8 vec[]) : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {
    MyColor(vec[0], vec[1], vec[2], vec[3]);
}
uint8 operator [](int i) {
    return v[i];
}
operator const GLubyte*() {
    return v;
}
};

А вот код, который я пытаюсь:

uint8 tmp[] = {1,2,3,4};
MyColor c(tmp);
printf("%d, %d, %d, %d\n", c.r, c.g, c.b, c.a);

(Мне бы понравилось, если бы я мог сделать MyColor c = {1,2,3,4}, но я не уверен, что это возможно в текущей спецификации?)

Во всяком случае, это выводит это:

1, 2, 3, 4
112, 22, 104, 89

Значит, значения, которые он получает во втором конструкторе, верны, но когда он возвращает ... эти значения случайные ??

r = red должен установить r и v[0] на red не так ли? Поскольку r является просто ссылкой на v[0], они на самом деле имеют одинаковое значение, нет? Я не делаю какой-то странной переназначения ссылки где-нибудь в космосе, не так ли?

Ответы [ 2 ]

4 голосов
/ 10 августа 2009

К сожалению, вы не можете сейчас выполнять пересылку конструктора в C ++. Вопрос здесь:

MyColor(uint8 vec[]) : r(v[0]),  g(v[1]), b(v[2]), a(v[3]) {
    MyColor(vec[0], vec[1], vec[2], vec[3]);
}

Что это на самом деле делает, так это привязывает ссылки к вектору-члену v, а затем в теле конструктора создает временное значение MyColor, которое затем выбрасывается.

Вторая строка вашего вывода выводит начальные значения мусора вектора-члена v построенного MyColor.

Я бы порекомендовал разбить часть присваивания значения конструктору, взяв 4 uint8 с и вызвав его из обоих конструкторов.

void AssignColorValues( uint8 red, uint8 green, uint8 blue, uint8 alpha)
{
    printf("%d, %d, %d, %d\n", red, green, blue, alpha);
    r = red;
    g = green;
    b = blue;
    a = alpha;
}

MyColor(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) : r(v[0]),  g(v[1]),     b(v[2]), a(v[3])
{
    AssignColorValues( red, green, blue, alpha );
}

MyColor(uint8 vec[]) : r(v[0]),  g(v[1]), b(v[2]), a(v[3])
{
    AssignColorValues(vec[0], vec[1], vec[2], vec[3]);
}
0 голосов
/ 10 августа 2009

На самом деле, я считаю, что вы можете сделать большую часть этого сегодня. boost :: array может быть инициализирован из константного выражения, так что вы также должны это делать. Однако я верю, что вам придется избавиться от других конструкторов. Вы можете сохранить операторы присваивания, если это поможет.

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