[英]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.