C++ c++;参数未传递到操作员过载<;
为类“State”创建运算符重载时,我重载的运算符没有初始化任何成员变量C++ c++;参数未传递到操作员过载<;,c++,object,overloading,operator-keyword,C++,Object,Overloading,Operator Keyword,为类“State”创建运算符重载时,我重载的运算符没有初始化任何成员变量 bool operator<(const State m)const { return (mDist < m.mDist); } 关于我应该检查哪些内容可能导致值无法传递给操作员的建议 编辑: 这是我的国家班 #pragma once #ifndef STATE_H_ #define STATE_H_ #include<iostream> #include
bool operator<(const State m)const
{
return (mDist < m.mDist);
}
关于我应该检查哪些内容可能导致值无法传递给操作员的建议
编辑:
这是我的国家班
#pragma once
#ifndef STATE_H_
#define STATE_H_
#include<iostream>
#include <vector>
using namespace std;
const int SIZE = 3;
class State
{
private:
int board[SIZE][SIZE];
int blankRow;
int blankCol;
State *parent;
State *goal;
public:
State()
{
int counter = 0;
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
{
setValue(i, j, counter);
counter++;
}
int mDist = 0;
}
State(const State& s)
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
board[i][j] = s.getValue(i, j);
}
State(const State& s, int r, int c, State *g)
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
board[i][j] = s.getValue(i, j);
blankRow = r;
blankCol = c;
goal = g;
findMDist(*goal);
}
//get
int mDist;
//find
void findMDist(State Goal);
bool operator<( State m)const
{
return (mDist < m.mDist);
}
};
#endif
#pragma一次
#ifndef州_
#定义状态_
#包括
#包括
使用名称空间std;
常数int SIZE=3;
阶级国家
{
私人:
集成电路板[尺寸][尺寸];
int blankRow;
int blankCol;
国家*父母;
国家*目标;
公众:
国家()
{
int计数器=0;
对于(int i=0;i0)
{
状态n(当前、行、列);
n、 swapLeft();
n、 findMDist(目标);
下一个移动推送(n);
}
}
关于我应该检查哪些内容的任何建议可能会导致值不正确
是否传递给操作员过载
当您将
状态
的副本传递给运算符布尔运算符时,运算符没有成员变量。您是否将操作员作为州的成员实施
?请检查您的复制构造函数-您正在传递的是副本,而不是引用。更改bool运算符您的构造函数未初始化mDist
(而是隐藏mDist
成员的同名局部变量)。我看不到findMDist()
方法的实现,但也可能是您没有正确设置mDist
,复制构造函数没有复制mDist
,您在操作符中传递值,这可能是一种好的做法,但它本身并不能解释未初始化的成员,除非OP未能正确实现其复制构造函数,在这种情况下,应该对此进行解释。我认为mDist应该在复制构造函数之后计算。它需要更改对象并重新计算mDist。还值得一提的是,s.mDist也没有在操作符中初始化。为什么您认为除了复制构造函数所说的操作之外,还会发生任何事情?因为什么时候复制某个东西也会导致“之后”发生其他神奇的事情?@下划线\d感谢您注意到您的权利,我可能应该首先正确地获取复制构造函数。我确实有一个n.findMDist(goal),它是在构造函数之后调用的,我希望该构造函数能够基于不同的状态对象为mDist设置值。
#pragma once
#ifndef STATE_H_
#define STATE_H_
#include<iostream>
#include <vector>
using namespace std;
const int SIZE = 3;
class State
{
private:
int board[SIZE][SIZE];
int blankRow;
int blankCol;
State *parent;
State *goal;
public:
State()
{
int counter = 0;
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
{
setValue(i, j, counter);
counter++;
}
int mDist = 0;
}
State(const State& s)
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
board[i][j] = s.getValue(i, j);
}
State(const State& s, int r, int c, State *g)
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
board[i][j] = s.getValue(i, j);
blankRow = r;
blankCol = c;
goal = g;
findMDist(*goal);
}
//get
int mDist;
//find
void findMDist(State Goal);
bool operator<( State m)const
{
return (mDist < m.mDist);
}
};
#endif
void Game::next() {
int row=0;
int col=0;
current.getBlank(row, col);
if (row > 0)
{
State u(current, row, col);
u.swapUp();
n.findMDist(goal);
nextMoves.push(u);
}
if (row < 2)
{
State d(current, row, col);
d.swapDown();
n.findMDist(goal);
nextMoves.push(d);
}
if (col < 2)
{
State n(current, row, col);
n.swapRight();
n.findMDist(goal);
nextMoves.push(n);
}
if (col > 0)
{
State n(current, row, col);
n.swapLeft();
n.findMDist(goal);
nextMoves.push(n);
}
}
bool operator<(State const &m) const
{
return (mDist < m.mDist);
}
bool operator<( State m)const
State(const State& s)
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
board[i][j] = s.getValue(i, j);
}