Что означает это "приведение" ?

 

Вижу в стандартной библиотеке такое:

((IndicatorBuffer*)At(i)).Name("LINE "+IntegerToString(i));

Что это за ужас IndicatorBuffer* ?

 
hoz:

Вижу в стандартной библиотеке такое:

Что это за ужас IndicatorBuffer* ?

Может любой буфер? Типа как something.*

 
hoz:

Вижу в стандартной библиотеке такое:

Что это за ужас IndicatorBuffer* ?

Это не ужас. Это указатель на объект типа IndicatorBuffer.

 
Ihor Herasko:

Это не ужас. Это указатель на объект типа IndicatorBuffer.

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

SymbolInfo  *m_symbol;

Тут всё понятно. А в случае выше почему-то символ * находится не перед переменной указателя, а прямо после переменной класса..

 

А что не так ?

Все верно - функция At() возвращает указатель на базовый класс, а чтобы получить доступ к функции имени - надо иметь указатель на класс IndicatorBuffer, соответственно, производится приведение типов.

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

 
Georgiy Merts:

А что не так ?

Все верно - функция At() возвращает указатель на базовый класс, а чтобы получить доступ к функции имени - надо иметь указатель на класс IndicatorBuffer, соответственно, производится приведение типов.

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

Хм. Хотите сказать, что я чутка не корректно пишу в этом плане?

Имею ввиду, нужно писать не так:

SymbolInfo  *m_symbol;

а так?

SymbolInfo*  m_symbol;

И получается, читается это всё так?

"Создаём экземпляр указателя на класс SymbolInfo который будет называться  m_symbol". Т.е. SymbolInfo* это указатель, на класс SymbolInfo, а m_symbol экземпляр этого указателя т.е. сам объект класса SymbolInfo.

Верно?

 
hoz:
 

Верно?

Верно то, что вы написали про создание экземпляра класса указателя.

Но, в случае с  IndicatorBuffer* - ситуация совсем другая, там ничего не создается, там происходит преобразование указателей.

Вам следует почитать про преобразование указателей.  Скажем, в вашем случае указатель m_symbol - это указатель на объект типа SymbolInfo, а его, при необходимости, можно преобразовать, скажем, к указателю на объект CObject:

CObject * pObjPointer = NULL; // Создаем указатель на CObject и обнуляем его


pObjPointer = (CObject*)m_symbol; // преобразовываем указатель m_symbol к типу указателя на CObject и заполняем этим указателем переменную, созданную выше. 


Причина обращения: