在派生类中包装私有容器的操作符[]



我试图实现一个名为:Shape& move_up(int index)的包装函数,它将访问和修改vector<T*> v1元素,在派生类中,名为: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;
}

相关内容

  • 没有找到相关文章

最新更新