【问题标题】:Different input format for an object in C++C ++中对象的不同输入格式
【发布时间】:2021-08-16 06:53:07
【问题描述】:

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

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

    return aliasCin;
}

这是我的类 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,但我认为应该有比这更简单的方法。还是这是我唯一的选择?

【问题讨论】:

标签: c++ istream


【解决方案1】:

这取决于你想简化什么。

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

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

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

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

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

让我们加快速度。如果有另一个 ComplexNumber 类并且它需要表达式参数怎么办?然后在两个不同的地方有两个独立但相似的代码 sn-p,这导致(似乎)难以维护代码。

离开表达式解析器做解析工作。

【讨论】:

  • 感谢您的时间和精力,但我有一个问题。如果我想cin >> r,函数定义会是什么样子,这样如果我输入-2.4-12/5 它应该生成相同的对象,因为-2.4 和-12/5 是相等的。
  • @blackmamba 你需要一个 c++ 数学表达式解析器。那里有很多图书馆。 (例如:在 github 上)。我没有这方面的经验,所以现在不接受推荐图书馆的问题。
【解决方案2】:

是的。您可以通过链接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

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多