Перегрузка операторов

 

Класс-обертка для массива (для использования указателя на массив) реализована таким способом.

class CBuffer  : public CObject
  {
public:
   double            buffer[];
   double            operator[](const int i)             {  return buffer[i]; }
                     CBuffer(void){}
                    ~CBuffer(void){}
  };

Можно ли в такой конструкции перегрузить оператор "=" для присвоения значения элементу массива через класс?

CBuffer array;

array[0] = 1.5;
 

К сожалению, напрямую, как в C++ нельзя, так как в MQL нельзя возвращать ссылку.

Есть такой вариант:

#include <Object.mqh>

class CBuffer  : public CObject
{
   double buffer[];

   struct ArrayCursor
   {

   private:
      CBuffer* mBuffer;
      int mIndex;

   public:
      ArrayCursor( CBuffer* buffer, int i ) : mBuffer( buffer ), mIndex( i ){}
      ArrayCursor( const ArrayCursor& ac ) : mBuffer( ac.mBuffer ), mIndex( ac.mIndex ){}

      void operator=( const double val )
      {
          mBuffer.buffer[mIndex] = val;
      }
   };

public:
   CBuffer(){}
   ~CBuffer(){}

   ArrayCursor operator[]( const int i );
   const double operator[]( const int i ) const;
};


CBuffer::ArrayCursor CBuffer::operator[]( const int i )
{
   return ArrayCursor( &this, i );
}

const double CBuffer::operator[]( const int i ) const
{
   return buffer[i];
}

Минус его в том, что для чтения из массива, объект должен быть константным.

А для записи в массив он должен быть не константным.

 
Koldun Zloy #:

К сожалению, напрямую, как в C++ нельзя, так как в MQL нельзя возвращать ссылку.

Есть такой вариант:

Минус его в том, что для чтения из массива, объект должен быть константным.

А для записи в массив он должен быть не константным.

Компилятор ругается на эту строку:

CBuffer::ArrayCursor CBuffer::operator[]( const int i )

мне она тоже не понятна

 
Alexandr Atagyan #:

Компилятор ругается на эту строку:

мне она тоже не понятна

У меня не ругается.

И что конкретно Вам не понятно?

 
Koldun Zloy #:

У меня не ругается.

И что конкретно Вам не понятно?

#include <Object.mqh>

class CBuffer  : public CObject
{
   struct ArrayCursor
   {

   private:
      CBuffer* mBuffer;
      int mIndex;

   public:
      ArrayCursor( CBuffer* buffer, int i ) : mBuffer( buffer ), mIndex( i ){}
      ArrayCursor( const ArrayCursor& ac ) : mBuffer( ac.mBuffer ), mIndex( ac.mIndex ){}

      void operator=( const double val )
      {
          mBuffer.buffer[mIndex] = val;
      }
   };

public:
   CBuffer(){}
   ~CBuffer(){}
   
   double buffer[];

   ArrayCursor operator[]( const int i )  {  return ArrayCursor( &this, i ); }
   const double operator[]( const int i ) const;
};

const double CBuffer::operator[]( const int i ) const
{
   return buffer[i];
}

так компилируется без ошибок.

Спасибо!