2015-10-15 6 views
-1

Я пытаюсь реализовать функцию оберточной имени: Shape& move_up(int index), что будет получать доступ и изменять элементы из vector<T*> v, в производном классе с именем: class Group.Обертывание оператор [] частного контейнера в производном классе

Я пытаюсь сделать это, обернув T& operator[](int i) { return *v[i]; } базового класса:

Group.h:

// class Group is a container of Shapes 
class Group: public Graph_lib::Vector_ref<Shape>{ 
public: 
    // constructors 
    Group::Group() 
    : upperLeft(0, 0), gridSideX(50), gridSideY(50), gridRowNumber(5), gridColumnNumber(5) 
    { 
    // create grid 
    for (size_t i = 0; i <= gridRowNumber; ++i){ 
     for (size_t j = 0; j <= gridColumnNumber; ++j){ 
       Graph_lib::Rectangle* rec = new Graph_lib::Rectangle(Point(upperLeft.x + gridSideX * j, upperLeft.y + gridSideY * i), gridSideX, gridSideY); 
       rec->set_fill_color(((i + j) % 2 == 0) ? Color::black : Color::white); 
       push_back(rec); 
     } 
    } 
    } 

    Shape& move_up(int i) { return operator[](i).move(0, 70); } 
private: 
    Point upperLeft; 
    int gridSideX; 
    int gridSideY; 
    int gridRowNumber; 
    int gridColumnNumber; 
}; 

main.cpp

#include <iostream> 
#include <vector> 
#include "Graph.h" 
#include "Simple_window.h" 
#include "Group.h" 

int main(){ 
    // define a window 
    Point tl(x_max()/2,0); 
    int width = 700; 
    int height = 700; 
    string label = "class Group"; 
    Simple_window sw(tl, width, height, label); 

    // instantiate a class Group object 
    Group gr(); 
    for (size_t i = 0; i < gr.size(); ++i) sw.attach(gr[i]); 
    sw.wait_for_button(); 
} 

В настоящее время функция обертка становится подчеркнуто красным, при наведении над ним отображается следующее сообщение:

Error: initial value to reference to non-const must be an lvalue

Проблема заключается в том, что я не могу найти правильный способ доступа и изменения элементов в векторе базового класса, таким образом, следующий вопрос:

Что я делаю неправильно? Как правильно реализовать функцию Shape& move_up(int index);?


1. Применить функцию move();, которая изменяет координаты Shape элемента вектора.

2. Все дополнительные файлы для компиляции могут быть найдены: here и here.

+5

Действительно ли это связано с перегрузкой 'operator []' или с наследованием или с шаблонами? Что возвращает '.move()'? Если это не ссылка, возвращаемое значение для 'move_up' не может быть связано. Представьте [минимальный тест] (http://stackoverflow.com/help/mcve) (и, пожалуйста, я не должен был предлагать вам делать это каждый раз, когда я вижу один из ваших вопросов) –

+2

Кажется, что 'Group 'наследование от MyVector ' нарушает Принцип замены Лискова. – TartanLlama

+0

@TartanLlama Просто прочитайте принцип; класс, вероятно, будет реализован с помощью 'MyVector ' как члена данных. – Ziezi

ответ

2

Функция move_up() должна:

  • изменить Shape «s координата
  • возврат товара Shape& таким образом, чтобы он мог быть attache() d на объект окна, и его новое местоположение отображается на экране.

Чтобы сделать это, он просто должен быть разделен на две линии, где первая линия модифицирует Shape объект и второй линии возвращает его по ссылке:

Shape& move_up(int i) { 
    operator[](i).move(0, 70); 
    return operator[](i); 
} 

или предложенных molbdnilo :

Shape& move_up(int i) { 
    auto& el = (*this)[i]; 
    el.move(0, 70); 
    return el; 
} 
+2

Или '(* this) [i]', что менее шумно. – molbdnilo

2

Ваша функция move() возвращает void:

virtual void move(int dx, int dy); 

Что вы ожидаете тогда, когда вы пытаетесь, чтобы ваши move_up() вернуть результат из move():

return <something>.move(0, 70); 

особенно ранее сказал компилятор, который move_up() должен вернуть Shape&?

Смежные вопросы