簡體   English   中英

為什么我的代碼與 cout 有問題&lt; <num0+num1?< div><div id="text_translate"><p> 代碼在main中有問題。 當我嘗試cout&lt;&lt;num0-num1; 單獨或cout&lt;&lt;num0+num1; 單獨他們工作正常,但是當我一起做時,代碼只是停止打印其中一個,代碼的 rest 停止。 我的意思是:如果我把主要寫成:</p><pre class="lang-cpp prettyprint-override"> cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;"idk whats wrong";</pre><p> 它工作正常並打印出來:</p><pre> 90/150 13/65 2/5 1/1 idk whats wrong Process returned -1073741819 (0xC0000005) execution time: 2.184 Press any key to continue.</pre><p> 但是,如果我把它寫成</p><pre class="lang-cpp prettyprint-override"> cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;num0+num1; cout&lt;&lt;"idk whats wrong";</pre><p> 它打印:</p><pre> Hello world: 90/150 13/65 2/5 Process returned -1073741819 (0xC0000005) execution time. 2.608 s Press any key to continue.</pre><p> 這是代碼:<strong>主要:</strong></p><pre class="lang-cpp prettyprint-override"> #include &lt;iostream&gt; using namespace std; #import "Fraction.h" int main() { cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;num0+num1; cout&lt;&lt;"idk whats wrong"; return 0; }</pre><p> <strong>分數 header:</strong></p><pre class="lang-cpp prettyprint-override"> #ifndef FRACTION_H #define FRACTION_H #include &lt;iostream&gt; using namespace std; class Fraction { public: Fraction(int num, int denom); Fraction(); Fraction reducedFraction(Fraction fract); Fraction operator+(const Fraction &amp;fraction); Fraction operator-(const Fraction &amp;fraction); Fraction&amp; operator= (const Fraction &amp;fraction); Fraction operator/(const Fraction &amp;fraction); Fraction operator*(const Fraction &amp;fraction); bool operator&lt;(const Fraction &amp;fraction); bool operator&gt;(const Fraction &amp;fraction); bool operator&lt;=(const Fraction &amp;fraction); bool operator&gt;=(const Fraction &amp;fraction); bool operator==(const Fraction &amp;fraction); friend ostream&amp; operator&lt;&lt;(ostream&amp; os, const Fraction&amp; fraction); friend istream&amp; operator&gt;&gt;(istream&amp; is, Fraction&amp; fraction); void setNum(int num); int getNum(); void setDenom(int denom); int getDenom(); virtual ~Fraction(); private: int num; int denom; int* arrN; int* arrD; int* arrC; }; #endif // FRACTION_H</pre><p> <strong>分數.cpp</strong></p><pre> #include "Fraction.h" Fraction::Fraction() { num=1; denom=1; } Fraction::Fraction(int num,int denom) { this-&gt;num=num; this-&gt;denom = denom; } void Fraction::setNum(int num) { this-&gt;num = num; } void Fraction::setDenom(int denom) { this-&gt;denom = denom; } int Fraction::getDenom() { return denom; } int Fraction::getNum() { return num; } Fraction Fraction::operator+(const Fraction&amp; fraction) { Fraction tmp; tmp.num=(this-&gt;num*fraction.denom)+(fraction.num*this-&gt;denom); tmp.denom =this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator-(const Fraction &amp;fraction) { Fraction tmp; tmp.num=(this-&gt;num*fraction.denom)-(fraction.num*this-&gt;denom); tmp.denom =this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator*(const Fraction &amp;fraction){ Fraction tmp; tmp.num=this-&gt;num*fraction.num; tmp.denom=this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator/(const Fraction &amp;fraction){ Fraction tmp; tmp.num=this-&gt;num*fraction.denom; tmp.denom=this-&gt;denom*fraction.num; return reducedFraction(tmp); } bool Fraction::operator==(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)==(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&gt;(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&gt;(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&lt;(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&lt;(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&gt;=(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&gt;=(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&lt;=(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&lt;=(fraction.num/fraction.denom)){ return true; } else { return false; } } Fraction&amp; Fraction::operator= (const Fraction &amp;fraction) { this-&gt;num=fraction.num; this-&gt;denom = fraction.denom; return *this; } ostream&amp; operator&lt;&lt;(ostream&amp; os, const Fraction&amp; fraction) { os&lt;&lt;fraction.num&lt;&lt;"/"&lt;&lt;fraction.denom&lt;&lt;endl; return os; } Fraction Fraction::reducedFraction( Fraction fract) { int* arrN = new int[fract.num]; int* arrD = new int[fract.denom]; int* arrC; int countN=0; int countD=0; for (int i = 2; i&lt;=fract.num; i++) { if (fract.num%i==0) { arrN[countN]=i; countN++; } } for (int i = 2; i&lt;=fract.denom; i++) { if (fract.denom%i==0) { arrD[countD]=i; countD++; } } if (countN&gt;=countD) { arrC = new int[countN]; } else { arrC = new int[countD]; } int countC =0; for ( int i = 0; i &lt;countN; i++) { for (int j=0; j&lt;countD; j++) { if(arrN[i]==arrD[j]) { arrC[countC]=arrN[i]; countC++; } } } int maxN = arrC[0]; for ( int i =1; i&lt;countC; i++) { if (arrC[i]&gt;maxN) { maxN=arrC[i]; } } Fraction tmp; tmp.num = fract.num/maxN; tmp.denom=fract.denom/maxN; return tmp; } Fraction::~Fraction() { delete[]arrC; delete[]arrN; delete[]arrD; }</pre> </div></num0+num1?<>

[英]Why does my code have trouble with cout<<num0+num1?

代碼在main中有問題。 當我嘗試cout<<num0-num1; 單獨或cout<<num0+num1; 單獨他們工作正常,但是當我一起做時,代碼只是停止打印其中一個,代碼的 rest 停止。 我的意思是:如果我把主要寫成:

    cout << "Hello world!" << endl;
    Fraction num0(90,150);
    Fraction num1(13,65);
    Fraction num2;
    cout<<num0;
    cout<<num1;
    cout<<num0-num1;
    cout<<num2;
    cout<<"idk whats wrong";

它工作正常並打印出來:

90/150
13/65
2/5
1/1
idk whats wrong
Process returned -1073741819 (0xC0000005)   execution time : 2.184
Press any key to continue.

但是,如果我把它寫成

   cout << "Hello world!" << endl;
    Fraction num0(90,150);
    Fraction num1(13,65);
    Fraction num2;
    cout<<num0;
    cout<<num1;
    cout<<num0-num1;
    cout<<num2;
    cout<<num0+num1;
    cout<<"idk whats wrong";

它打印:

Hello world!
90/150
13/65
2/5

Process returned -1073741819 (0xC0000005)   execution time : 2.608 s
Press any key to continue.

這是代碼:主要:

#include <iostream>
using namespace std;
#import "Fraction.h"

int main()
{
    cout << "Hello world!" << endl;

    Fraction num0(90,150);
    Fraction num1(13,65);
    Fraction num2;
    cout<<num0;
    cout<<num1;
    cout<<num0-num1;
    cout<<num2;
    cout<<num0+num1;
    cout<<"idk whats wrong";

    return 0;
}

分數 header:

#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;

class Fraction
{
public:
    Fraction(int num, int denom);
    Fraction();
    Fraction reducedFraction(Fraction fract);

    Fraction operator+(const Fraction &fraction);
    Fraction operator-(const Fraction &fraction);
    Fraction& operator= (const Fraction &fraction);
    Fraction operator/(const Fraction &fraction);
    Fraction operator*(const Fraction &fraction);

    bool operator<(const Fraction &fraction);
    bool operator>(const Fraction &fraction);
    bool operator<=(const Fraction &fraction);
    bool operator>=(const Fraction &fraction);
    bool operator==(const Fraction &fraction);

    friend ostream& operator<<(ostream& os, const Fraction& fraction);
    friend istream& operator>>(istream& is,  Fraction& fraction);

    void setNum(int num);
    int getNum();
    void setDenom(int denom);
    int getDenom();
    virtual ~Fraction();


private:
    int num;
    int denom;
    int* arrN;
    int* arrD ;
    int* arrC;
};

#endif // FRACTION_H

分數.cpp

#include "Fraction.h"
Fraction::Fraction()
{
    num=1;
    denom=1;
}
Fraction::Fraction(int num,int denom)
{
    this->num=num;
    this->denom = denom;
}
void Fraction::setNum(int num)
{
    this->num = num;
}
void Fraction::setDenom(int denom)
{
    this->denom = denom;
}
int Fraction::getDenom()
{
    return denom;
}
int Fraction::getNum()
{
    return num;
}
Fraction Fraction::operator+(const Fraction& fraction)
{
    Fraction tmp;
    tmp.num=(this->num*fraction.denom)+(fraction.num*this->denom);
    tmp.denom =this->denom*fraction.denom;
    return reducedFraction(tmp);

}
Fraction Fraction::operator-(const Fraction &fraction)
{
    Fraction tmp;
    tmp.num=(this->num*fraction.denom)-(fraction.num*this->denom);
    tmp.denom =this->denom*fraction.denom;
    return reducedFraction(tmp);

}
Fraction Fraction::operator*(const Fraction &fraction){
    Fraction tmp;
    tmp.num=this->num*fraction.num;
    tmp.denom=this->denom*fraction.denom;
    return reducedFraction(tmp);

}
Fraction Fraction::operator/(const Fraction &fraction){
    Fraction tmp;
    tmp.num=this->num*fraction.denom;
    tmp.denom=this->denom*fraction.num;
    return reducedFraction(tmp);

}
bool Fraction::operator==(const Fraction &fraction){
    if((this->num/this->denom)==(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator>(const Fraction &fraction){
    if((this->num/this->denom)>(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator<(const Fraction &fraction){
    if((this->num/this->denom)<(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator>=(const Fraction &fraction){
    if((this->num/this->denom)>=(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
bool Fraction::operator<=(const Fraction &fraction){
    if((this->num/this->denom)<=(fraction.num/fraction.denom)){
            return true;
    }
    else {
        return false;
    }
}
Fraction& Fraction::operator= (const Fraction &fraction)
{
    this->num=fraction.num;
    this->denom = fraction.denom;
    return *this;

}
ostream& operator<<(ostream& os, const Fraction& fraction)
{
    os<<fraction.num<<"/"<<fraction.denom<<endl;
    return os;
}


Fraction Fraction::reducedFraction( Fraction fract)
{
    int* arrN = new int[fract.num];
    int* arrD = new int[fract.denom];
    int* arrC;
    int countN=0;
    int countD=0;
    for (int i = 2 ; i<=fract.num; i++)
    {
        if (fract.num%i==0)
        {
            arrN[countN]=i;
            countN++;
        }
    }
    for (int i = 2 ; i<=fract.denom; i++)
    {
        if (fract.denom%i==0)
        {
            arrD[countD]=i;
            countD++;
        }
    }
    if (countN>=countD)
    {
        arrC = new int[countN];
    }
    else
    {
        arrC = new int[countD];
    }
    int countC =0;

    for ( int i = 0 ; i <countN; i++)
    {
        for (int j=0; j<countD; j++)
        {
            if(arrN[i]==arrD[j])
            {
                arrC[countC]=arrN[i];
                countC++;

            }
        }
    }
    int maxN = arrC[0];
    for ( int i =1; i<countC; i++)
    {
        if (arrC[i]>maxN)
        {
            maxN=arrC[i];
        }

    }
    Fraction tmp;
    tmp.num = fract.num/maxN;
    tmp.denom=fract.denom/maxN;
    return tmp;

}

Fraction::~Fraction()
{
    delete[]arrC;
    delete[]arrN;
    delete[]arrD;

}

該錯誤看起來像是由釋放未初始化指針的析構函數引起的。

除引起錯誤外未使用的成員變量

    int* arrN;
    int* arrD ;
    int* arrC;

和刪除語句只是為了導致錯誤

    delete[]arrC;
    delete[]arrN;
    delete[]arrD;

應該被刪除。

之后,在reducedFraction function中使用的本地arrays應該在reducedFraction末尾刪除,然后再返回。 否則 arrays 將被泄露。


    Fraction tmp;
    tmp.num = fract.num/maxN;
    tmp.denom=fract.denom/maxN;

    // free the arrays
    delete[] arrN;
    delete[] arrD;
    delete[] arrC;

    return tmp;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM