gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:14 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com