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
格式。
其中 a
和 b
是有理数的分子和分母。找到它们后,我可以
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++;
}
首先我想到了一个字符串作为输入,在字符串中找到/
的索引,然后找到a
和b
,但我认为应该有一个比这简单的方法。还是这是我唯一的选择?
这取决于你想简化什么。
您可以将字符串作为构造函数的参数。让构造函数解析该字符串。
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
我最近学会了如何将 cin
与 class 的对象一起使用。
istream& operator>>(istream& aliasCin, RationalNumber& r) {
double temp;
aliasCin >> temp;
r = RationalNumber(temp);
return aliasCin;
}
这是我的 class RationalNumber,如您所见,我接受了一个 double 并将其传递给我的非默认构造函数。我知道这是如何工作的,但是 ...
我的问题是,我还想要另一种样式来输入我的有理数,使其采用 a/b
格式。
其中 a
和 b
是有理数的分子和分母。找到它们后,我可以
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++;
}
首先我想到了一个字符串作为输入,在字符串中找到/
的索引,然后找到a
和b
,但我认为应该有一个比这简单的方法。还是这是我唯一的选择?
这取决于你想简化什么。
您可以将字符串作为构造函数的参数。让构造函数解析该字符串。
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