首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重载operator=,不同的类作为参数

重载operator=,不同的类作为参数
EN

Stack Overflow用户
提问于 2013-05-15 19:13:02
回答 4查看 469关注 0票数 0

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

我知道问题出在'Ciezarowy:: operator = (const Samochod &sam)‘的operator=重载中,并在'ciezar = samochody;’执行。

很抱歉使用long main()函数,但我这么做是为了学习,所以我希望看到所有操作的结果。

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

代码语言:javascript
运行
复制
#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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-15 19:16:27

您的operator=应该返回对该对象的引用。现在,它不会返回任何内容。在不返回任何内容的情况下从非空函数中流出是未定义的行为

代码语言:javascript
运行
复制
Samochod& Samochod::operator = (const Samochod &sam)
        ^^
{
    if(this == &sam)
        return *this;

    marka = sam.marka;
    pojemnosc = 3000;
    przebieg = sam.przebieg;
    return *this;
    ^^^^^^^^^^^^
}
票数 3
EN

Stack Overflow用户

发布于 2013-05-15 19:23:34

您需要包含<string>

赋值运算符必须返回某些内容,否则这是未定义的行为

代码语言:javascript
运行
复制
Samochod Samochod::operator = (const Samochod &sam)
{
    marka = sam.marka;
    pojemnosc = 3000;
    przebieg = sam.przebieg;
    return *this;
}

它的传统是返回引用

代码语言:javascript
运行
复制
Samochod& Samochod::operator = (const Samochod &sam)
{
    marka = sam.marka;
    pojemnosc = 3000;
    przebieg = sam.przebieg;
    return *this;
}

在编写赋值操作符时,检查this != &rhs也是非常必要的。你可以在有限的情况下逃脱惩罚,但你最终会后悔的。

代码语言:javascript
运行
复制
Samochod& Samochod::operator = (const Samochod &sam)
{
    if(this != &sam)
    {
        marka = sam.marka;
        pojemnosc = 3000;
        przebieg = sam.przebieg;
    }
    return *this;
}

编辑:提高警告级别并将警告视为错误是非常值得的。这在新的C++代码库中尤其值得,因为您不需要太多的遗留问题--编写无警告的代码要比将旧的代码库转换为警告代码容易得多。它会捕获像这样的问题以及更多的问题。

票数 1
EN

Stack Overflow用户

发布于 2013-05-15 19:51:02

更改返回类型,如下所示

代码语言:javascript
运行
复制
Samochod Samochod::operator = (const Samochod &sam)
{
    return *this;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16563525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档