2016-10-07 5 views
0

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

Vector Класс:

class vec { 
public: 
    vec(int len) { 
     length = len; 
     data = new double [len]; 
    } 

    proxy operator[](int i) { 
     if (i >= 0 && i < length) { 
      return proxy(i, data); 
     } 
     else { 
      std::cerr << "AHHHH!\n"; 
      exit(1); 
     } 
    } 
private: 
    int length; 
    double * data; 
}; 

Proxy класс:

class proxy { 
public: 
    proxy(int i, double * d) { 
     index = i; 
     data = d; 
    } 

    void operator=(double rhs) { 
     data[index] = rhs; 
    } 

private: 
    int index; 
    double * data; 
}; 

Как я могу назначить элементы из вектора (точнее, из прокси) к переменной типа двойной? Другими словами, как я выполняю следующее:

int main() { 
    vec a(2); 
    double x = 3.14; 
    a[0] = x; // Works! 
    x = a[0]; // How to make work? 

    return 0; 
} 

К сожалению, я не могу написать что-то вроде:

friend double operator=(double & lhs, const proxy & p) { ... } 

так operator= должен быть членом.

ответ

1

Добавить функцию преобразования в класс прокси:

class proxy 
{ 
pubblic: 
    operator double() const { return data[index]; } 

    // ... 
}; 
+0

Круто! Я не знал, что 'double()' был оператором, который может быть перегружен. –