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 向量?不知道有没有道理。
到目前为止我尝试过的:
- 制作 xCoord 和 yCoord public 变量并手动更新它们,而不是制作 setter 函数。这没有用。
- 我在每一步打印出 x 和 y 值。在 setXY 中,值已成功更新,但当函数结束时,它们又回到原来的状态。
- 我尝试使用 const 关键字搞得一团糟,但我不理解它,甚至无法将其输入 运行。
- 通过 reference/value
传递所有内容
- 在 main 中创建一个接受磁盘向量作为输入的新函数,并使用 getDisks 作为该函数的输入。没用,同样的问题。
- 测试了我的另一个 setter 函数 nameDisk,它工作正常。它本质上与 setXY 相同,这就是为什么我认为问题出在 getDisks 上。
- 自始至终在不同点使用指针(呵呵),但我不确定这样做的最佳方法。我昨晚搞砸了所以我不记得 100% 但我想我试图让 getDisks return 一个指针而不是向量,我认为这没有用,但它更可能是一个问题使用我的语法以及我如何使用指针。我认为这可能有效,但我不知道如何摇动它。
帮忙?
您走在正确的轨道上 - 不知何故,您看到的对象与您认为的不同。使用引用是一个很好的解决方案,但您可能没有找到正确的方法 ;-)
尝试:
// 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 磁盘所必需的。
基本上,我有两个 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 向量?不知道有没有道理。
到目前为止我尝试过的:
- 制作 xCoord 和 yCoord public 变量并手动更新它们,而不是制作 setter 函数。这没有用。
- 我在每一步打印出 x 和 y 值。在 setXY 中,值已成功更新,但当函数结束时,它们又回到原来的状态。
- 我尝试使用 const 关键字搞得一团糟,但我不理解它,甚至无法将其输入 运行。
- 通过 reference/value 传递所有内容
- 在 main 中创建一个接受磁盘向量作为输入的新函数,并使用 getDisks 作为该函数的输入。没用,同样的问题。
- 测试了我的另一个 setter 函数 nameDisk,它工作正常。它本质上与 setXY 相同,这就是为什么我认为问题出在 getDisks 上。
- 自始至终在不同点使用指针(呵呵),但我不确定这样做的最佳方法。我昨晚搞砸了所以我不记得 100% 但我想我试图让 getDisks return 一个指针而不是向量,我认为这没有用,但它更可能是一个问题使用我的语法以及我如何使用指针。我认为这可能有效,但我不知道如何摇动它。
帮忙?
您走在正确的轨道上 - 不知何故,您看到的对象与您认为的不同。使用引用是一个很好的解决方案,但您可能没有找到正确的方法 ;-)
尝试:
// 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 磁盘所必需的。