gpt4 book ai didi

c++参数未传递给运算符重载<

转载 作者:行者123 更新时间:2023-11-30 03:24:11 25 4
gpt4 key购买 nike

为类“State”创建运算符重载时,我重载的运算符没有初始化任何成员变量。

    bool operator<(const State m)const  
{
return (mDist < m.mDist);
}

将状态添加到调用此运算符的优先级队列时,mDist 的值未初始化

这是开始这个​​过程的代码

int row=0;
int col=0;
current.getBlank(row, col); // gets position of 0 in 3x3 int array


if (row > 0)
{
//creates a new state with current 3x3 array and postion of 0 as member variables
State u(current, row, col);
u.swapUp(); // swaps 0 with position above it
//n.findMDist(goal); //calculates Manhattan distance from goal state
nextMoves.push(u); //push into queue
}

关于我应该检查哪些可能导致值无法传递给运算符过载的任何建议?

编辑:

这是我的州级。

#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

这里是实现mDist的地方

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 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);
}

这只会复制 board .它完全忽略了通过复制所有其他成员变量(包括有问题的 mDist)来正确完成其工作。 .

所以,operator<最终处理一个不完整的拷贝,其中多个成员变量未初始化,因此您可以通过随后读取它们来调用未定义的行为。

修复是:

  • 实现一个适当的复制构造函数来完成它的工作,即复制所有成员变量并在完成后导致所有外部可见状态相同。
  • 不过,不要按值传递给复制构造函数,因为那是资源浪费和糟糕的语义。路过const&相反。

关于c++参数未传递给运算符重载<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49875412/

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