C++ 涉及类函数的问题

C++ 涉及类函数的问题,c++,function,class,parameters,C++,Function,Class,Parameters,我在通过main中的函数传递类参数时遇到问题。我的print函数语法正确。我遇到问题的函数是将f2传递到fracmult函数中。如果有人对代码有任何解释或想法,可以使分子和名词与f1和f2相乘,那就太好了。注意:这是我第一次上课 class fraction { private: int numerator; int denom; bool positive; public: void inputFrac();

我在通过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
类分数
{
私人:
整数分子;
int-denom;
布尔阳性;
公众:
void inputFrac();
void printFrac();
分数fracMult(分数b);
分数fracDiv(分数b);
分数分数分数相加(分数b);
分数fracSub(分数b);
};
空隙率::printFrac()
{
如果(!正)
{

cout在分数::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::fracMult(fraction b)
{
     numerator=b.numerator;
     denom=b.denom;
     return *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;
}
但是这就是为什么有
操作符*
操作符*=
的原因。您需要决定函数应该执行哪些操作。要么更改当前对象,要么使用当前对象的数据计算并返回新对象。

类分数
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
}
{ 私人: 整数分子; int-denom; 字符选择; 公众: void inputFrac(); void printFrac(); 分数fracMult(分数b); 分数fracDiv(分数b); 分数分数分数相加(分数b); 分数fracSub(分数b); }; 空隙率::printFrac() { 如果(选项=='y'|选项=='y') {
cout究竟是什么问题?编译器错误?运行时错误?运行时错误。假设我输入的值最终为f1.numerator=1 f1.denom=2 f2.numerator=3和f2.denom=4,然后执行f1.fracmult(f2)功能它最终类似于-1650232/0,因此我需要有关正确代码的帮助。请不要在评论中提供额外信息,通过单击
edit
将其添加到您的帖子中。是否有人知道如何正确显示正确的标志,但您也需要说明标志是否有一种方法可以做到这一点而无需说明rs?我们还没有学会这些yet@John我给出的答案中没有指针。这是一件好事-
fraction
类中不需要任何指针。*在*中,这是解引用运算符,因为“this”是一个隐式指针,指向调用非静态函数的对象。Paul的答案中没有显式指针。这是返回“您自己的对象”的唯一方法内method@John-希望您理解您的问题由两个问题组成,主要问题是您没有返回值。如果没有
返回值
,则没有返回值的代码是否正确计算了项目无关紧要。如果没有返回值,您的程序可能刚刚崩溃,或者返回了错误的结果,即使您计算出正确的值。所以,也许你的分数类决定做一些奇怪的乘法?没关系,因为这不是重点——重要的是你不能调用一个期望返回值的函数,而不能返回值。这是个坏主意,因为那样你会改变原始对象(这)。如果您创建一个新对象,则最好计算其各自的值并返回新对象,而不是*this。这是一个设计决策。或者,他可以有一个静态函数,以常量引用的两个分数作为参数并返回其乘积。我选择了此选项,因为他已经为所有字段设置了赋值当我尝试为4个运算符编写所有代码时,我只能返回第一种类型(即*),现在我的问题是尝试在main中返回所有函数。你的意思是什么?你是否尝试实现加法和减法?函数签名的基础将保持不变(无论你选择哪种设计)。或者你可以重载+-*和/运算符,但这有点高级。确切地说,我正试图通过4个不同的函数对2个分数执行所有4个运算符,并将它们全部返回到main中,但目前只有第一个运算符返回。我使用了这种方法,它起了作用,我现在如何调整t他有正确的标志吗?