涉及 class 个函数的问题
Trouble involving class functions
我在通过函数传递 class 参数时遇到问题 main.I 打印函数的语法正确。我遇到问题的函数是将 f2 传递给 fracmult 函数。如果有人对代码有任何解释或想法,这些代码会导致分子和分母一起乘以 f1 和 f2,那将是非常好的。注意:这是我第一次使用 classes
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
在 fraction::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;
}
当您编译代码时,是否有一条警告指出您正在退出一个需要 return 值但没有 return 值的函数?
fraction fraction::fracMult(fraction b)
{
numerator=b.numerator;
denom=b.denom;
}
您已经定义了一个 return 是 fraction
的函数,但是您未能 return 一个值。因此该函数会产生 未定义的行为 。
解决方法是 return 分数对象。
fraction fraction::fracMult(fraction b)
{
numerator=b.numerator;
denom=b.denom;
return *this;
}
然而,这似乎违反直觉。如果您要将对象乘以一个值并 return 一个新的 fraction
,则必须创建 this
的副本,然后 return 副本。您不想更改当前分数。
fraction fraction::fracMult(fraction b)
{
fraction temp(*this);
temp.numerator=b.numerator;
temp.denom=b.denom;
return temp;
}
如果您真的想改变当前分数,那么 return 对 *this
的引用,而不是新对象:
fraction& fraction::fracMult(fraction b)
{
numerator=b.numerator;
denom=b.denom;
return *this;
}
但这就是为什么有operator *
和operator *=
的原因。您需要决定您的函数应该执行哪些操作。要么改变当前对象,要么使用当前对象的数据进行计算并return创建一个新对象。
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
}
我在通过函数传递 class 参数时遇到问题 main.I 打印函数的语法正确。我遇到问题的函数是将 f2 传递给 fracmult 函数。如果有人对代码有任何解释或想法,这些代码会导致分子和分母一起乘以 f1 和 f2,那将是非常好的。注意:这是我第一次使用 classes
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
在 fraction::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;
}
当您编译代码时,是否有一条警告指出您正在退出一个需要 return 值但没有 return 值的函数?
fraction fraction::fracMult(fraction b)
{
numerator=b.numerator;
denom=b.denom;
}
您已经定义了一个 return 是 fraction
的函数,但是您未能 return 一个值。因此该函数会产生 未定义的行为 。
解决方法是 return 分数对象。
fraction fraction::fracMult(fraction b)
{
numerator=b.numerator;
denom=b.denom;
return *this;
}
然而,这似乎违反直觉。如果您要将对象乘以一个值并 return 一个新的 fraction
,则必须创建 this
的副本,然后 return 副本。您不想更改当前分数。
fraction fraction::fracMult(fraction b)
{
fraction temp(*this);
temp.numerator=b.numerator;
temp.denom=b.denom;
return temp;
}
如果您真的想改变当前分数,那么 return 对 *this
的引用,而不是新对象:
fraction& fraction::fracMult(fraction b)
{
numerator=b.numerator;
denom=b.denom;
return *this;
}
但这就是为什么有operator *
和operator *=
的原因。您需要决定您的函数应该执行哪些操作。要么改变当前对象,要么使用当前对象的数据进行计算并return创建一个新对象。
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
}