使用包含许多变量的构造函数时。我首先初始化它然后把它放到构造函数中。使用这种方法,数据只能通过文件或控制台单独输入。
但是当使用istream运算符>>时。我使用默认构造函数,然后将其放入istream运算符>>方法。但我发现它似乎以这种方式除了默认构造函数之外没有必要使用其他构造函数,但属性可以通过文件或控制台输入。 例如:
class Fraction
{
private:
int numerator;
int denominator;
public:
Fraction(int num,int den);
Fraction();
friend istream& operator>>(istream& is,Fraction &frac);
};
void main()
{
int num,int den;
cin>>num>>den;
Fraction fra(num,den);
}
istream& operator>>(istream& is,Fraction &frac)
{
is>>frac.numerator>>frac.denominator;
return is;
}
void main()
{
Fraction f;
ifstream inputFile("data.txt");
if(inputFile.file())
{
cout<<"File cannot be opened!"<<endl;
}
inputFile>>f;
inputFile.close();
//with input from console
cin>>f;
}
我的问题是应该使用第一个或第二个推荐哪种方法?
答案 0 :(得分:1)
编写安全,方便您使用的代码。
Fraction
类很简单,它具有广泛的潜在用途,因此它同时具有构造函数和序列化运算符是合理的。作为一般规则,简单和通用的类是最好的。
对于包含许多属性或具有复杂验证规则的结构化数据的类,使用具有许多参数的构造函数(或许多构造函数重载以及令人困惑的替代参数选择)可能不方便,因此您可以跳过它并且不需要。但这对程序设计来说是一个危险信号,是“上帝阶级”问题的症状。
答案 1 :(得分:0)
通常,数值是默认构造的,然后从输入中读取,因为它们对于默认构造和赋值非常便宜。在这种情况下,如果你想这样做,这只是一种风格问题。
尽管如此,您的代码中仍有一个主要错误:
istream& operator>>(istream& is,Fraction &frac);
像@这样的运算符的成员重载是这样的:
istream& operator>>(istream& is);
重载operator>>
的常用方法是写这个:
friend istream& operator>>(istream& is, Fraction& frac);
为什么不是会员?因为如果它是成员,你会写下这个:
object >> stream;
这非常烦人无用。