Звёздочка (*) перед классом

98
18 декабря 2020, 03:50

Что означает такая конструкция?

class Class 
{
   private:
      double* vertical;
      double* horizontal;
   public:
      static double* GetVertical() { return vertical; }
      static double* GetHorizontal() { return horizontal; }
}
void Class::SetFunction(AnotherClass & another)
{
    *Class::GetVertical() = another.mVerticalPlane;
    *Class::GetHorizontal() = another.mHorizontalPlane;
}

Это разыменование? Если да, то почему нужно разыменовывать сам класс, а не его экземпляр?

Answer 1

Это скорее всего разыменование результата вызова статической функции (или функции из пространства имён, как корректно заметил в комментариях VTT, но всё же несколько странно иметь пространство имён с именем SomeClass). Например:

struct SomeClass 
{
    static int* Method();
};

В общем случае, возвращаться может не обычный "голый" указатель, а какой-то другой класс, имеющий перегруженный operator*, в частности, сюда подпадают всевозможные умные указатели или итераторы контейнерных классов.

Answer 2

В языке С++ постфиксные операторы и :: всегда имеют приоритет над унарными. Поэтому никакого "разыменовывать самого класса" в вашем коде нет. Выражение

*Class::GetVertical()

группируется грамматикой языка как

*(Class::GetVertical())

то есть это применение оператора * к результату вызова функции Class::GetVertical.

Зачем автор кода в данном случае использовал квалифицированное имя функции Class::GetVertical вместо просто GetVertical - не ясно, но ошибки в этом нет.

READ ALSO
Отловить сочетание клавиш в консоли

Отловить сочетание клавиш в консоли

1) Код должен быть или кроссплатформенный, или 2а варианта кода (под Windows и Linux)

137
Проблема с PlaySoundA

Проблема с PlaySoundA

Воспроизвожу звук так:

120