基本上,我有两个类,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;
}