gpt4 book ai didi

c++ - 重载运算符=,不同的类作为参数

转载 作者:行者123 更新时间:2023-11-27 23:15:39 25 4
gpt4 key购买 nike

我对下面的代码有问题,它编译了,但输出崩溃到桌面,没有给我任何我做错了什么的建议。

我知道问题出在 operator= 在 'Ciezarowy::operator = (const Samochod &sam)' 处重载并在 'ciezar[0] = samochody[0];'

抱歉 main() 太长了,但我这样做是为了学习目的,所以我想查看所有操作的结果。

这是代码,由 CodeBlocks/MinGW 编译。

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;


class Samochod{

public:

string marka;
int pojemnosc;
double przebieg;
Samochod();
Samochod operator = (const Samochod &sam);
Samochod(const Samochod &sam);
};

Samochod::Samochod()
{

string marki[5] = {"Opel","Audi","Toyota","Fiat","Mazda"};
int index = rand() % 5;
marka = marki[index];
pojemnosc = rand() % 2000 + 1200;
przebieg = 40000;
}


Samochod Samochod::operator = (const Samochod &sam)
{

marka = sam.marka;
pojemnosc = 3000;
przebieg = sam.przebieg;
}



Samochod::Samochod(const Samochod &sam)
{

marka = sam.marka;
pojemnosc = 3000;
przebieg = sam.przebieg;
}



class Osobowy:public Samochod
{
public:
Osobowy();
int lpas;
double pojb;
int ldrzwi;
};

Osobowy::Osobowy()
: lpas( 5 )
, pojb( rand() % 100 + 80 )
, ldrzwi ( 5 )
{

}

class Ciezarowy:public Samochod
{
public:
Ciezarowy();
int losi;
double ladownosc;
bool samow;
Ciezarowy operator = (const Samochod &sam);

};

Ciezarowy::Ciezarowy()
: losi ( rand() % 2 + 2 )
, ladownosc ( 1000 )
, samow ( 1 )
{

}


Ciezarowy Ciezarowy::operator = (const Samochod &sam)
{
marka = sam.marka;
przebieg = sam.przebieg;
}


int main()
{
srand( time( NULL ) );
Samochod samochody[4];

Samochod samoch[3];

for ( int i = 0;i<3;i++){
samoch[i] = samochody[i];}

cout<<samochody[0].marka<<endl;
cout<<samochody[0].pojemnosc<<endl;
cout<<samochody[0].przebieg<<endl;
cout<<samochody[1].marka<<endl;
cout<<samochody[1].pojemnosc<<endl;
cout<<samochody[1].przebieg<<endl;
cout<<samochody[2].marka<<endl;
cout<<samochody[2].pojemnosc<<endl;
cout<<samochody[2].przebieg<<endl;
cout<<samochody[3].marka<<endl;
cout<<samochody[3].pojemnosc<<endl;
cout<<samochody[3].przebieg<<endl;
cout<<samoch[0].marka<<endl;
cout<<samoch[0].pojemnosc<<endl;
cout<<samoch[0].przebieg<<endl;
cout<<samoch[1].marka<<endl;
cout<<samoch[1].pojemnosc<<endl;
cout<<samoch[1].przebieg<<endl;
cout<<samoch[2].marka<<endl;
cout<<samoch[2].pojemnosc<<endl;
cout<<samoch[2].przebieg<<endl;

Osobowy osob[3];

osob[1].ldrzwi = 3;
osob[1].lpas = 4;
cout<<osob[0].marka<<endl;
cout<<osob[0].pojemnosc<<endl;
cout<<osob[0].przebieg<<endl;
cout<<osob[0].ldrzwi<<endl;
cout<<osob[0].lpas<<endl;
cout<<osob[0].pojb<<endl;
cout<<osob[1].marka<<endl;
cout<<osob[1].pojemnosc<<endl;
cout<<osob[1].przebieg<<endl;
cout<<osob[1].ldrzwi<<endl;
cout<<osob[1].lpas<<endl;
cout<<osob[1].pojb<<endl;
cout<<osob[2].marka<<endl;
cout<<osob[2].pojemnosc<<endl;
cout<<osob[2].przebieg<<endl;
cout<<osob[2].ldrzwi<<endl;
cout<<osob[2].lpas<<endl;
cout<<osob[2].pojb<<endl;

Ciezarowy ciezar[2];

ciezar[0] = samochody[0];

ciezar[1].ladownosc = 500;
ciezar[1].samow = 0;

cout<<ciezar[0].marka<<endl;
cout<<ciezar[0].pojemnosc<<endl;
cout<<ciezar[0].przebieg<<endl;
cout<<ciezar[0].losi<<endl;
cout<<ciezar[0].ladownosc<<endl;
cout<<ciezar[0].samow<<endl;
cout<<ciezar[1].marka<<endl;
cout<<ciezar[1].pojemnosc<<endl;
cout<<ciezar[1].przebieg<<endl;
cout<<ciezar[1].losi<<endl;
cout<<ciezar[1].ladownosc<<endl;
cout<<ciezar[1].samow<<endl;

return 0;
}

最佳答案

您的 operator= 应该返回对该对象的引用。现在它不返回任何东西。从非 void 函数中流出而不返回任何内容是未定义的行为

Samochod& Samochod::operator = (const Samochod &sam)
^^
{
if(this == &sam)
return *this;

marka = sam.marka;
pojemnosc = 3000;
przebieg = sam.przebieg;
return *this;
^^^^^^^^^^^^
}

关于c++ - 重载运算符=,不同的类作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16563525/

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