C++ 在main中调用的类方法,更改为don';不坚持课外方法?

C++ 在main中调用的类方法,更改为don';不坚持课外方法?,c++,class,vector,methods,setter,C++,Class,Vector,Methods,Setter,基本上,我有两个类,Peg和Disk。(这是河内塔计划)我拥有的文件是Disk.h、Disk.cpp、Peg.h、Peg.cpp和main.cpp。不知道这是否重要。这是disk.h中的disk类 #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

基本上,我有两个类,Peg和Disk。(这是河内塔计划)我拥有的文件是Disk.h、Disk.cpp、Peg.h、Peg.cpp和main.cpp。不知道这是否重要。这是disk.h中的disk类

#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
以下是我在main中对它的称呼:

pegVec[2].getDisks()[0].setXY(690, 200);
我知道这看起来很疯狂,但基本上pegVec是一个由3个peg对象组成的向量。每个peg对象都有一个函数getDisks(),该函数返回当前peg上所有磁盘的向量。因此,上面的这一行试图在PEG2上的第一个peg上执行setXY。如果不清楚的话,很抱歉,但是我尝试过创建一个新的磁盘对象并调用它,但也没有成功

下面是getDisks,如果有必要的话:

std::vector<Disk> Peg::getDisks()
{
    return disksOn;
}
std::vector Peg::getDisks()
{
返回disksOn;
}
disksOn只是Peg的一个成员变量:

std::vector<Disk> disksOn;
std::vector disksOn;
我认为getDisks()的工作方式可能有问题。我是一个noob,但我猜返回向量disksOn会生成它的一个“副本”,这是我用setXY函数修改的,但它与与Peg对象关联的实际disksOn向量不同?我不知道这是否有道理

到目前为止,我所尝试的:

  • 生成xCoord和yCoord公共变量并手动更新它们,而不是生成setter函数。这不起作用
  • 我在每一步都打印出x和y值。在setXY内部,值已成功更新,但当函数结束时,它们又恢复到原来的状态
  • 我试着把const关键字弄得一团糟,但我不明白,甚至无法让它运行
  • 通过引用/值传递所有内容
  • 在main中创建一个新函数,该函数接受一个磁盘向量作为输入,并使用getDisks作为该函数的输入。没用,同样的问题
  • 测试了我的另一个setter函数nameDisk,它工作正常。它本质上与setXY相同,这就是为什么我认为问题在于getDisks
  • 在各个点使用指针(呵呵),但我不确定最好的方法。昨晚我把它搞乱了,所以我不记得100%,但我想我试着让getDisks返回一个指针而不是向量,我认为这不起作用,但更可能是我的语法和如何使用指针的问题。我想这可能行得通,但我不知道如何摆脱它

帮助?

你走对了方向-不知何故,你看到的对象与你想象的不同。使用引用是一个很好的解决方案,但您可能没有找到正确的解决方案;-)

尝试:

//返回对peg上磁盘的引用。
std::vector&Peg::getDisks()
{
返回disksOn;
}

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

尝试:

//返回对peg上磁盘的引用。
std::vector&Peg::getDisks()
{
返回disksOn;
}
问题在于
std::vector getDisks(){return disksOn;}
返回disksOn的全新且独立的临时副本,而不是对原始副本的引用。因此,您正在修改一个临时副本,该副本在语句末尾被丢弃

你需要使用
std::vector&getDisks(){return disksOn;}
以向disksOn返回引用

尽管如果要返回对vector成员对象的引用,也可以将该对象作为公共对象直接访问,因为此时任何人都可以操作该向量,并删除getDisks()函数,因为它在访问保护方面没有任何用途

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

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

const Disk &getDisk(int index) const { 
  return disksOn[index]; 
}
不允许直接访问向量背后的想法是,如果需要,您可以稍后更改底层容器类型,而无需更改Peg类之外的代码

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

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

你需要使用
std::vector&getDisks(){return disksOn;}
以向disksOn返回引用

尽管如果要返回对vector成员对象的引用,也可以将该对象作为公共对象直接访问,因为此时任何人都可以操作该向量,并删除getDisks()函数,因为它在访问保护方面没有任何用途

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

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

const Disk &getDisk(int index) const { 
  return disksOn[index]; 
}
不允许直接访问向量背后的想法是,如果需要,您可以稍后更改底层容器类型,而无需更改Peg类之外的代码


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

Ah,这很有效!非常感谢你。我记得昨晚试过了,但我把它弄得太复杂了。啊,成功了!非常感谢你。我记得昨晚试过了,但我把它弄得太复杂了。谢谢你的回答。你能解释一下常量磁盘对象和常规磁盘对象之间的区别吗?const Disk对象是不可变的吗?简单地说:是。常量对象是不能直接更改的对象,只能对其调用常量成员函数。但是,可以通过对同一对象使用不同的非常量指针或非常量引用来更改它,一些函数可能会通过执行
const_cast()
来更改它,例如,对于实现referec
Disk &getDisk(int index) { 
  return disksOn[index]; 
}

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