Я пытаюсь реализовать функцию оберточной имени: 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.
Действительно ли это связано с перегрузкой 'operator []' или с наследованием или с шаблонами? Что возвращает '.move()'? Если это не ссылка, возвращаемое значение для 'move_up' не может быть связано. Представьте [минимальный тест] (http://stackoverflow.com/help/mcve) (и, пожалуйста, я не должен был предлагать вам делать это каждый раз, когда я вижу один из ваших вопросов) –
Кажется, что 'Group 'наследование от MyVector' нарушает Принцип замены Лискова. –
TartanLlama
@TartanLlama Просто прочитайте принцип; класс, вероятно, будет реализован с помощью 'MyVector' как члена данных. –
Ziezi