我试图实现一个名为:Shape& move_up(int index)
的包装函数,它将访问和修改vector<T*> v
的1元素,在派生类中,名为: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
问题是我找不到访问和修改基类vector中的元素的正确方法,因此出现以下问题:
我做错了什么?如何正确实现Shape& move_up(int index);
功能?
<一口> 1。应用move();
函数,改变向量的Shape
元素的坐标一口>
<一口> 2。所有用于编译的附加文件可以在这里和这里找到。一口>
你的函数move()
返回void
:
virtual void move(int dx, int dy);
当您尝试让move_up()
返回move()
的结果时,您期望什么:
return <something>.move(0, 70);
特别是你之前告诉编译器move_up()
应该返回Shape&
?
move_up()
函数必须:
- 修改
Shape
坐标 - 返回
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;
}