2015-11-27 4 views
0

У меня возникли проблемы с передачей параметра класса с помощью функции main. У меня есть синтаксис для функции печати. Функция, с которой возникает проблема im, передает 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 
+0

Что такое * точно * проблема? Ошибка компилятора? Ошибка выполнения? – PaulMcKenzie

+0

Ошибка выполнения. Скажем, значения i вводятся как f1.numerator = 1 f1.denom = 2 f2.numerator = 3 и f2.denom = 4, а затем я выполняю функцию f1.fracmult (f2), которая заканчивается как -1650232/0, поэтому мне нужна помощь с правильным кодом – John

+1

Пожалуйста, не указывайте дополнительную информацию в комментариях, добавьте ее в свой пост, нажав «edit» – RHA

ответ

0

дробью :: 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; 

} 
+0

плохая идея, потому что таким образом вы измените исходный объект (это). Лучше, если вы создадите новый объект, вычислите его соответствующие значения и вернете новый объект вместо * this. – DeiDei

+0

Это дизайнерское решение. в качестве альтернативы он мог бы иметь статическую функцию, которая принимает две фракции по ссылке const в качестве параметра и возвращает свой продукт. Я выбрал этот вариант, потому что у него уже было задание для всех полей. – ForeverStudent

+0

Когда я попытался выполнить все коды для 4 операторов, я могу только вернуть первый тип (который есть *), теперь моя проблема пытается получить все функции, которые будут возвращены в основном – John

0

Когда вы собрали ваш код, было ли предупреждение, указывающее, что вы выходите из функции, ожидающей возврата значения, но не возвращающего значения?

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 *=. Вам нужно решить, какую из этих операций должна выполнять ваша функция. Либо изменение текущего объекта, либо вычисление с использованием данных текущего объекта и возврат нового объекта.

+0

, но вам также необходимо учитывать Знаки – ForeverStudent

+0

есть ли способ сделать это без указателей? мы еще не узнали об этом – John

+0

@John В ответе, который я представил, нет указателей. И это * * хорошая вещь - нет необходимости в указателях в вашем классе 'fraction'. – PaulMcKenzie

0
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 
} 
+0

, потому что знак темпа не правильно установлен – ForeverStudent

+0

Я использовал этот метод, и он сработал, как я теперь настроюсь на правильный знак? – John

Смежные вопросы