基本上,我有两个类,Peg和Disk。 (这是Tower of Hanoi程序)我拥有的文件是Disk.h,Disk.cpp,Peg.h,Peg.cpp和main.cpp。不确定是否重要。这是Disk.h中的磁盘类

#include <vector>
#include "gwindow.h"
#ifndef DISK_H
#define DISK_H

class Disk
{
private:
    int xCoord; //x and y coords are for drawing in a gwindow
    int yCoord;
    int mHeight;
    int mWidth;
    COLOR mColor;
    int mName;  //helps me keep track of which is which

public:
    Disk(); //default constructor
    Disk(int x, int y, int heightIn, int widthIn, COLOR colorIn);
    void setXY(int x, int y); //this is the one I'm having trouble with
    int getHeight();
    int getWidth();
    int getX();
    int getY();
    COLOR getColor();
    std::string diskColor();
    void draw(GWindow &gw);
    void nameDisk(int name);  //yet this one is working?
    int getName();
};

#endif


但是,我在使用setXY函数时遇到了麻烦。当我从main调用它时,它会正确调用该函数,在setXY范围内更改该变量,但该值不会在函数外部持久存在。但是,nameDisk可以正常工作,并且基本上是同一件事,除了更改mName而不是xCoord和yCoord。这是setXY:

void Disk::setXY(int x, int y)
{
    xCoord = x;
    yCoord= y;
}


这是我从main调用的方式:

pegVec[2].getDisks()[0].setXY(690, 200);


我知道这看起来很疯狂,但基本上pegVec是3个peg对象的向量。每个钉对象都有一个函数getDisks(),该函数返回该钉当前所有磁盘的向量。因此,上面的代码行尝试在钉2的第一个钉上执行setXY。很抱歉,如果不清楚,但是我尝试制作一个新的磁盘对象并在其上调用它,但这也不起作用。

如果需要的话,这里是getDisks:

std::vector<Disk> Peg::getDisks()
{
    return disksOn;
}


而disksOn只是Peg的成员变量:

std::vector<Disk> disksOn;


我认为getDisks()的工作方式可能有问题。我是菜鸟,但我猜想返回向量disksOn会对其进行“复制”,这是我使用setXY函数更改的内容,但与与之关联的实际disksOn向量不同钉对象?我不知道这是否有意义。

到目前为止,我已经尝试过:


使xCoord和yCoord公共变量并手动更新它们,而不是使用setter函数。这没有用。
我在每一步都打印出了x和y值。在setXY内部,这些值已成功更新,但是当函数结束时,它们又回到了原来的状态。
我尝试使用const关键字搞乱了一些,但我不理解它,甚至无法运行它。
通过参考/值传递一切
在main中创建一个新函数,该函数接受Disk向量作为输入,并使用getDisks作为该函数的输入。没用,同样的问题。
测试了我的其他设置器函数nameDisk,该函数运行正常。它与setXY本质上相同,这就是为什么我认为问题出在getDisks上。
贯穿始终在各个点(heh)使用指针,但是我不确定做到这一点的最佳方法。昨晚我搞砸了它,所以我不记得100%了,但是我想我试图让getDisks返回一个指针而不是向量,并且我认为这没有用,但是我的语法和我如何使用指针。我认为这可能有效,但我不知道如何动摇它。


救命?

最佳答案

您处在正确的轨道上-某种程度上您正在寻找与您想像的对象不同的对象。使用引用是一个很好的解决方案,但是您可能没有一个合适的;-)

尝试:

// Return reference to the disks on the peg.
std::vector<Disk>& Peg::getDisks()
{
    return disksOn;
}

10-04 10:24