c++ - 在 main 中调用类方法,更改不会在类方法外部持续存在?

标签 c++ class vector methods setter

基本上,我有两个类,Peg 和 Disk。 (这是一个汉诺塔程序)我有的文件是 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 对象的 vector 。每个 peg 对象都有一个函数 getDisks(),它返回当前该 peg 上所有磁盘的 vector 。所以上面的行试图在 peg 2 的第一个 peg 上执行 setXY。抱歉,如果不清楚,但我已经尝试制作一个新的磁盘对象并在上面调用它,但也没有用。

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

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

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

std::vector<Disk> disksOn;

我认为 getDisks() 的工作方式可能存在问题。我是菜鸟,但我猜想返回 vector disksOn 会生成它的“拷贝”,有点像,这是我用 setXY 函数改变的,但它与关联的实际 disksOn vector 不同Peg 对象?我不知道这是否有意义。

到目前为止我尝试了什么:

  • 制作 xCoord 和 yCoord 公共(public)变量并手动更新它们,而不是制作 setter 函数。这没有用。
  • 我在每一步都打印出 x 和 y 值。在 setXY 中,值已成功更新,但当函数结束时,它们又回到原来的状态。
  • 我尝试对 const 关键字进行一些修改,但我不理解它,甚至无法运行它。
  • 通过引用/值传递所有内容
  • 在 main 中创建一个接受磁盘 vector 作为输入的新函数,并使用 getDisks 作为该函数的输入。没有用,同样的问题。
  • 测试了我的另一个 setter 函数 nameDisk,它工作正常。它与 setXY 本质上相同,这就是为什么我认为问题出在 getDisks 上。
  • 自始至终在不同点使用指针(呵呵),但我不确定这样做的最佳方式。我昨晚弄乱了它,所以我不记得 100% 但我想我试图让 getDisks 返回一个指针而不是 vector ,我认为这没有用,但这更有可能是我的语法和我如何使用指针。我认为这可能有效,但我不知道如何动摇它。

帮忙吗?

最佳答案

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

尝试:

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

关于c++ - 在 main 中调用类方法,更改不会在类方法外部持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939223/

相关文章:

c++ - 当一个类在构造函数中动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc?

java - Java中定义一个变量类型为另一个变量

c++ - 二维 vector 中的运算符 []

c++ - 模板类是怎么匹配的

php - 是否将大量参数传递给 parent::__construct 代码异味/糟糕的 OOP?

java - 访问不同 Java 类的变量时遇到问题

c++ - 多维 vector 和 csv 文件

结构内部的c++ vector

generics - 如果我已经为 U 实现了 From<T>,Rust 是否为 Vec<U> 实现了 From<Vec<T>>?

c++ - sizeof 和 unsigned char 数组错误? (c/c++)