C ++中对象的不同输入格式

Different input format for an object in C++

我最近学会了如何将 cin 与 class 的对象一起使用。

istream& operator>>(istream& aliasCin, RationalNumber& r) {
    double temp;
    aliasCin >> temp;
    r = RationalNumber(temp);

    return aliasCin;
}

这是我的 class RationalNumber,如您所见,我接受了一个 double 并将其传递给我的非默认构造函数。我知道这是如何工作的,但是 ...

我的问题是,我还想要另一种样式来输入我的有理数,使其采用 a/b 格式。 其中 ab 是有理数的分子和分母。找到它们后,我可以

RationalNumber::RationalNumber (const int& a, const int& b){
    this->a = a;
    this->b = b;
    standardize(); // Changes the values of the object to standard form
    reduce(); // Changes the Rational Number to irreducible fraction
    count++;
}

首先我想到了一个字符串作为输入,在字符串中找到/的索引,然后找到ab,但我认为应该有一个比这简单的方法。还是这是我唯一的选择?

这取决于你想简化什么。

您可以将字符串作为构造函数的参数。让构造函数解析该字符串。

RationalNumber::RationalNumber (const std::string& s){
    // parsing stuff
}

这是可能的,但不是一个好的解决方案。因为你需要让构造函数来处理解析,这不应该是 RationalNumber .

的责任

例如:以后RationalNumber会允许r = RationalNumber("1+2/3*4-5")吗?

对于一个简单的数据结构来说太复杂了。

让我们加大力度。如果还有另一个 ComplexNumber class 并且它采用表达式参数怎么办?然后在两个不同的地方有两个独立但相似的代码片段,这导致(似是而非)难以维护代码。

让表达式解析器执行解析工作。

是的。您可以通过链接 cin >> a >> b >> c.

来读取多个值

我不确定如何处理斜杠,这似乎没问题:

#include <iostream>

using namespace std;

int main(){
        int a;
        char separator;
        int b;

        cout << "Enter a fraction (e.g. 3/4): ";
        cin >> a >> separator >> b;
        cout << endl;
        if(separator=='/'){
                //do whatever
                cout << "Beep boop... " << a << "/" << b << "=" << (float)a/b << endl;
        }
        else{
                cout << "wrong separator: " << separator << " a=" << a << ", b=" << b << endl;
        }
}

示例输出:

~$ g++ test.cpp && ./a.exe
Enter a fraction (e.g. 3/4): 3 / 4

Beep boop... 3/4=0.75