簡體   English   中英

涉及班級職能的麻煩

[英]Trouble involving class functions

我在通過main中的函數傳遞類參數時遇到麻煩。我的print函數語法正確。 我遇到麻煩的功能是將f2傳遞給fracmult功能。 如果有人對代碼有任何解釋或想法,會使分子和標稱值乘以f1和f2在一起,那就太好了。 注意:這是我第一次上課

class fraction

{
    private:
        int numerator;
        int denom;
        bool positive;

    public:
        void inputFrac();
        void printFrac();

        fraction fracMult(fraction b);
        fraction fracDiv(fraction b);
        fraction fracAdd(fraction b);
        fraction fracSub(fraction b);
};

 void fraction::printFrac()
{
    if (!positive)
    {
    cout << "-";
    }
    cout << numerator << " / " << denom;
}
void fraction::inputFrac()
{    
    cout<<"Please input the numerator ";
    cin>>numerator;
    cout<< "Please input the denominator ";
    cin>>denom; 
    cout<<"Is the fraction positive? (Y or N);
    cin>>positive;
}

 fraction fraction::fracMult(fraction b)
{

     numerator=b.numerator;
     denom=b.denom;
}
fraction fraction::fracAdd(fraction& b)
 {
     fraction temp; 
     temp.numerator=numerator + b.numerator;
     temp.denom=denom + b.denom;

     return temp;
 }
 fraction fraction::fracDiv(fraction& b)
 {
     fraction temp;
     temp.numerator = numerator * b.denom;
     temp.denom = denom * b.numerator;

     return temp;

 }
 fraction fraction::fracSub(fraction& b)
 {

    fraction temp;
     temp.numerator = numerator - b.numerator;
     temp.denom = denom - b.denom;

     return temp;   
 }

int main(int argc, char** argv) {

    fraction f1, f2, fresult;

    f1.inputFrac(); //input the first fraction
    f2.inputFrac(); //input the second fraction
    cout<<endl;
    f1.printFrac();
    cout<<endl;
    f2.printFrac();
    cout<<endl;

    cout << "The result of a * b is: ";

    fresult = f1.fracMult(f2); // calculate a * b
    fresult.printFrac(); // print out the result

在分數:: fracMult中,您需要具備以下功能:

fraction fraction::fracMult( const fraction& b)
{
    if(positive==b.positive) positive=false;

    numerator *=b.numerator;
    denom *=b.denom;

    return *this;
}

或者,您可以擁有:

fraction fraction::fracMult(const fraction&b) const
{
  fraction output;
  output.numerator = this->numerator *b.numerator;
  output.denom = this->denom *b.denom ;
  output.positive=false;
  if(this->positive==b.positive) output.positive=true;

  return output;

}

編譯代碼時,是否有警告指出您正在退出期望返回值但未返回值的函數?

fraction fraction::fracMult(fraction b)
{
     numerator=b.numerator;
     denom=b.denom;
}

您已經定義了一個返回fraction的函數,但是您沒有返回值。 因此,該函數會產生未定義的行為

解決方法是返回分數對象。

fraction fraction::fracMult(fraction b)
{
     numerator=b.numerator;
     denom=b.denom;
     return *this;
}

但是,這似乎違反直覺。 如果你想,用一個值乘的對象,並返回一個新的fraction ,然后副本this必須創建,然后返回副本。 您不想更改當前分數。

fraction fraction::fracMult(fraction b)
{
     fraction temp(*this); 
     temp.numerator=b.numerator;
     temp.denom=b.denom;
     return temp;
}

如果您確實確實想更改當前分數,則返回對*this的引用,而不是新對象:

fraction& fraction::fracMult(fraction b)
{
     numerator=b.numerator;
     denom=b.denom;
     return *this;
}

但這就是為什么有operator *operator *= 您需要確定您的函數應該執行以下哪些操作。 要么更改當前對象,要么使用當前對象的數據進行計算並返回一個新對象。

class fraction
{
private:
    int numerator;
    int denom;
char choice;

public:
void inputFrac();
void printFrac();

fraction fracMult(fraction b);
fraction fracDiv(fraction b);
fraction fracAdd(fraction b);
fraction fracSub(fraction b);
}; 

void fraction::printFrac()
{
if (choice=='y'||choice=='Y')
{
cout << "-";
}
cout << numerator << " / " << denom;
}
void fraction::inputFrac()
{
 cout<<"Please input the numerator ";
cin>>numerator;
cout<< "Please input the denominator ";
cin>>denom;
cout<<"Is the fraction positive? (y or n)";
cin>>choice;
}

fraction fraction::fracMult(fraction b)
{

 fraction temp;
temp.numerator=numerator*b.numerator;
 temp.denom=denom*b.denom;
 return temp;
 }
 fraction fraction::fracAdd(fraction b)
 {
 fraction temp;
 temp.numerator=numerator + b.numerator;
 temp.denom=denom + b.denom;

 return temp;
 }
 fraction fraction::fracDiv(fraction b)
 {
 fraction temp;
 temp.numerator = numerator * b.denom;
 temp.denom = denom * b.numerator;

 return temp;

  }
 fraction fraction::fracSub(fraction b)
 {

 fraction temp;
 temp.numerator = numerator - b.numerator;
 temp.denom = denom - b.denom;

 return temp;
  }

 int main(int argc, char** argv) {

 fraction f1, f2, fresult;

f1.inputFrac(); //input the first fraction
f2.inputFrac(); //input the second fraction
cout<<endl;
f1.printFrac();
cout<<endl;
f2.printFrac();
cout<<endl;

cout << "The result of a * b is: ";

fresult = f1.fracMult(f2); // calculate a * b
fresult.printFrac(); // print out the result
}

暫無
暫無

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

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