2013-10-11 2 views
1

Я имею в своем классе gTexture две функции заявил:упрощая перегруженная функция класса

public: 
           gTexture():mActiveTexture(0){...} 
    virtual void    DrawTexture(); 
    virtual void    DrawTexture(unsigned short int TextureNumber); 
      int     mActiveTexture; 

где

void gTexture::DrawTexture() 
    { 
    gTexture::DrawTexture(mActiveTexture); 
    } 

Я хотел бы иметь это в одной функции что-то вроде

virtual void    DrawTexture(unsigned short int TextureNumber=mActiveTexture); 

Это не компилируется, так как mActiveTexture является недопустимым использованием нестатического элемента данных. Есть ли способ иметь только одну функцию, которая упростит работу с моими производными объектами? Благодарю.

+1

Что такое 'void foo(): x (y) {...}'? – juanchopanza

+0

@juanchopanza это инициализатор, может быть сделано только для конструкторов – wich

+0

@wich 'DrawTexture' не является конструктором. – juanchopanza

ответ

1

Я вижу два пути. Оба являются обходными, но могут быть полезны.

Первый заключается в том, чтобы сделать беспараметричную функцию не виртуальной; он всегда будет всегда вызывать второй с mActiveTexture.

Другой способ заключается в использовании знания предметной области (в частности, тот факт, что 0 не является допустимым OpenGL имя текстуры) и сделать это:

virtual void DrawTexture(unsigned short int TextureNumber = 0) { 
    if (TextureNumber == 0) TextureNumber = mActiveTexture; 
    // ... rest of the code 
} 
+1

Я думаю, что параметры по умолчанию в виртуальных функциях-членах слишком страшны. – juanchopanza

+0

@juanchopanza действительно проблематично, по меньшей мере, значение по умолчанию - это время компиляции, а используемое зависит от типа указателя/ссылки не фактического объекта. – wich

+0

ohh отличная помощь, спасибо. Но это второе местное временное не будет работать. [0] относится к первому элементу вектора текстур в моем случае. – user2856452

0

Вы могли бы иметь значение аргумента по умолчанию, не является допустимым (например, -1). Тогда ваша функция может проверить, является ли это значение значением по умолчанию, и если это так, используйте mActiveTexture, иначе он будет использовать аргумент.

+0

Это хорошая идея, но опасно, учитывая, что я использую массивы и -1 может привести к сбою моей программы. По этой причине я использовал его повсюду, но отвернулся от -1 во всей моей программе – user2856452

0

Нет, вы не можете использовать элементы в качестве значений по умолчанию. Значения по умолчанию используются во время компиляции.

Однако вы можете использовать специальное значение для значения по умолчанию, например -1, а затем проверить DrawTexture, если входные значения равны -1, и если это так установлено в mActiveTexture.

Смежные вопросы