Ошибки, баги, вопросы - страница 1706

 
Sergei Vladimirov:
this[0] здесь - rvalue.
Точно не так
class A
{
public:    
  int Tmp;
  
  void operator =( A* )
  {
  }

  void operator =( const int Value )
  {
    this.Tmp = Value;
  }
};

class B
{
public:  
  A* Data[];
  
  B()
  {
    ArrayResize(this.Data, 1);
  }

  A* operator []( const int Pos )
  {
    return(this.Data[Pos]);
  }
  
  void Init()
  {
    // this[0] = new A; // ошибка выполнения: invalid pointer access
    this.Data[0] = new A;
    
    this[0] = 5; // this[0] - НЕ rvalue
  } 
};

void OnStart()
{
  B b;
  
  b.Init();
  
  Print(b[0].Tmp);
}


Результат
2016.09.25 18:57:42.214 Test (RTS-12.16,M1)     5
Проблема в некоторой бессмысленности
void A::operator =( A* )
К сожалению, словарный запас скуден для объяснения.
 
Проблема в том указатель (дескриптор) из rvalue почему-то превращается в lvalue после присвоения переменной. Бредовато...
 

fxsaber:
Точно не так

Результат

Проблема в некоторой бессмысленности

 

К сожалению, словарный запас скуден для объяснения.

Ладно, неохота думать. Уставший уже.

 
Комбинатор:
Проблема в том указатель (дескриптор) из rvalue почему-то превращается в lvalue после присвоения переменной. Бредовато...
Да это я запутал. После
    A* a = this[0];
    a = new A; // так работает

Выражение

CheckPointer(this[0]) == POINTER_INVALID

будет true. Что полностью логично.

А так хорошо бы разработчикам четко и красиво сформулировать причину невозможности

this[0] = new A;
 
fxsaber:
Да это я запутал.
Да, затупил. Надо было проверить перед тем как на амбразуры бросаться. Короче все хорошо :)
 
Комбинатор:
Короче все хорошо :)
А я так и не понял последнего примера. Перегрузка оператора "=" в классе А превращает this[0] из rvalue в lvalue... Не могу понять, как. Это какие-то особенности МКЛ, в плюсах такого поведения нет. fxsaber, вы как, вообще, догадались до этой конструкции? Я имею в виду перегрузку = в А. Или методом тыка?
 
Указателю присваивается rvalue, которое потом затирается new A.
 
Комбинатор:
Указателю присваивается rvalue, которое потом затирается new A.

Где? Вот здесь?

 this[0] = new A;

Здесь operator[] возвращает значение, содержащееся в ячейке Data[0]. Не ссылку на эту ячейку, не указатель на неё, а просто копию содержащегося в этой ячейке значения, т.е. rvalue. Естественно, этой копии ничего присвоить нельзя. Как operator= в классе А это меняет, не пойму.

 
Sergei Vladimirov:
А я так и не понял последнего примера. Перегрузка оператора "=" в классе А превращает this[0] из rvalue в lvalue... Не могу понять, как. Это какие-то особенности МКЛ, в плюсах такого поведения нет. fxsaber, вы как, вообще, догадались до этой конструкции? Я имею в виду перегрузку = в А. Или методом тыка?
С полным пониманием делал. Иначе такое точно не написал бы

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: TypeToBytes

fxsaber, 2016.09.21 21:25

Опубликован. Теперь для любой переменной (структура или стандартный тип) работает не только чтение, как с массивом, но и ЗАПИСЬ:

_W(AnyVariable)[Pos] = AnyValue; // Записывает по байтовому смещению Pos значение AnyValue в переменную AnyVariable

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

Если кто знает нечто похожее, поделитесь ссылкой для образования.


 
fxsaber:
С полным пониманием делал. Иначе такое точно не написал бы

Т.е. всё понимаете, а сказать не можете? )) Ясненько.