Class 方法在 main 中被调用,更改不会在 class 方法之外持续存在?

Class method being called in main, changes don't persist outside class method?

基本上,我有两个 classes,Peg 和 Disk。 (这是一个河内塔程序)我的文件是 Disk.h、Disk.cpp、Peg.h、Peg.cpp 和 main.cpp。不确定这是否重要。这是来自 Disk.h

的磁盘 class
#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 对象的向量。每个 peg 对象都有一个函数 getDisks(),它 return 是当前该 peg 上所有磁盘的向量。所以上面的行试图在 peg 2 的第一个 peg 上执行 setXY。抱歉,如果不清楚,但我已经尝试制作一个新的磁盘对象并在上面调用它,但也没有用。

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

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

而disksOn只是Peg的一个成员变量:

std::vector<Disk> disksOn;

我认为这可能是 getDisks() 的工作方式有问题。我是菜鸟,但我猜 returning 矢量 disksOn 生成了它的 "copy",有点,这就是我正在用我的 setXY 函数改变的,但它是不一样的作为与 Peg 对象关联的实际 disksOn 向量?不知道有没有道理。

到目前为止我尝试过的:

帮忙?

您走在正确的轨道上 - 不知何故,您看到的对象与您认为的不同。使用引用是一个很好的解决方案,但您可能没有找到正确的方法 ;-)

尝试:

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

问题是 std::vector<Disk> getDisks() { return disksOn; } return是 disksOn 的全新独立 临时副本,而不是对原始文件的引用。因此,您正在修改一个临时副本,该副本在语句末尾被丢弃。

你需要使用 std::vector<Disk> &getDisks() { return disksOn; } 为了 return 参考 到 disksOn。

尽管如果您要 return 对 vector 成员对象的引用,您也可以使该对象像 public 一样可直接访问,因为此时任何人都可以操纵 vector 并摆脱getDisks() 函数,因为它在访问保护方面没有任何作用。

更好的设计是允许访问单个磁盘:

Disk &getDisk(int index) { 
  return disksOn[index]; 
}

const Disk &getDisk(int index) const { 
  return disksOn[index]; 
}

不直接访问向量背后的想法是,如果需要,您以后可以更改底层容器类型,而无需更改 Peg 外部的代码 class。

第二个版本 (const) 是访问 const Peg 对象的 const 磁盘所必需的。