2015-05-31 1 views
0

Я хочу создать несколько гибкое наследование для разных HLSL-шейдеров. К сожалению, мой запланированный маршрут не сработал, и мне интересно, почему. Вот что я делаю:Использовать base struct как аргумент функции в сценарии наследования

У меня есть база-структуры и некоторых структур, которые наследуют от него:

struct baseStruct {}; 

struct childStruct1 : public baseStruct { 
    int someInt1; 
    int someInt2; 
} 

struct childStruct2 : public baseStruct { 
    float someFloat1; 
    bool someBool1; 
} 

И абстрактный класс с чисто виртуальными функциями, заявленных как это:

class BaseClass { 
    virtual void Function1(baseStruct& structVal) = 0; 
    virtual void Function2(baseStruct& structVal) = 0; 
} 

Это по классу ребенок:

class ChildClass { 
    void Function1(baseStruct& structVal); 
    void Function2(baseStruct& structVal); 
} 

Теперь я хочу, чтобы иметь возможность вызвать либо эти функции с различными структурами, которые имеют baseStruct как родитель, как это:

childStruct1 cS1; 
cS1.someInt1 = 5; 
CS1.someInt2 = -3; 

Function1(cS1); 

Компилятор не жалуется, но когда я пошагово моей программы я заметил, что структура заполняется значениями перед функцией, но, как вскоре, когда я вхожу в свою функцию, структура пуста. Теперь мое первое впечатление будет заключаться в том, что это происходит из-за того, что он получает «casted» до baseStruct, который пуст. Есть ли способ достичь чего-то подобного, или я делаю что-то неправильно? Возможно, это даже возможно, и я трахался где-то в другом месте, но тогда почему отладчик говорит, что он пуст? Спасибо!

+1

'но как только я вхожу в свою функцию, структура пуста' Как вы это определяете? Вы смотрите на структуру в отладчике? Внутри функции тип параметра - «baseStruct &», который не имеет каких-либо членов, поэтому для отладчика ничего не видно. Как функция планирует использовать значения 'cS1.someInt1' и' cS1.someInt2' (и если она не планирует их использовать, то почему вам все равно, что это такое?) –

+0

Но что, если я хочу использовать те значения, определенные перед функцией внутри? Если baseStruct пуст, есть ли у них доступ к ним? Как мне вернуть его? EDIT: Эти структуры являются фактически постоянными буферами для шейдера и поэтому передаются непосредственно шейдеру. – puelo

+0

Вы отбрасываете его, используя бросок, конечно; например 'Static_cast (structVal)'. Вопрос в том, как вы планируете узнать, к какому типу нужно бросить? –

ответ

1

Структура, которую вы видите в отладчике, пуста, потому что когда вы вводите Function1, отладчик «забывает» любую информацию о cs1 и знает только о baseStruct (который пуст).

Если вы что-то вроде

childStruct *cs1 = reinterpret_cast<childStruct1>(&structVal) ; 

год к году должны увидеть все там.

Но это касается реальной проблемы дизайна: как вы узнаете, внутри Funtion1, если вы получили childStruct1 или childStruct2?

+0

Да, вы правы. Это действительно недостаток. Спасибо за вашу помощь! – puelo

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