【问题标题】:C++ class constructor and istream operator>>C++ 类构造函数和 istream 运算符>>
【发布时间】:2016-10-15 10:18:38
【问题描述】:
  1. 使用带有许多变量的构造函数时。我首先对其进行了初始化,然后将其放入构造函数中。这种方式只能通过文件或控制台分别输入数据。

  2. 但是当使用 istream 运算符时>>。我使用了默认构造函数,然后将其放入 istream operator>> 方法中。但是我发现这样似乎不需要使用除默认构造函数之外的其他构造函数,但是属性可以通过文件或控制台输入。 例如:

    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;
    }
    

我的问题是应该使用第一种还是第二种推荐哪种方法?

【问题讨论】:

  • 首先你的代码不应该工作。成员 operator&gt;&gt; 应该只有 1 个参数。即使你做对了,它也会看起来很奇怪:object&gt;&gt;stream。只需交朋友运算符>>并使用它。提供istream&amp; 构造函数会有点矫枉过正,而且不是很自然
  • 是的。我忘了用朋友作为运算符>>

标签: c++ class constructor operator-keyword istream


【解决方案1】:

编写安全方便你使用的代码。

Fraction 类很简单,并且具有多种潜在用途,因此它同时具有构造函数和序列化运算符是合理的。作为一般规则,简单和通用的类是最好的。

对于包含许多属性或具有复杂验证规则的结构化数据的类,具有许多参数的构造函数(或许多构造函数重载且替代参数选择混乱)可能不方便,因此您可以跳过它而无需.但这对程序设计来说是一个危险信号,是“神级”问题的症状。

【讨论】:

  • 你可以在std::string的界面上添加链接作为“神级”的例子,这样OP就可以“真正地理解”它。
【解决方案2】:

通常数值是默认构造的,然后从输入中读取,因为默认构造和分配它们非常便宜。在这种情况下,您是否愿意这样做只是风格问题。

尽管如此,您的代码中有一个重大错误:

istream& operator>>(istream& is,Fraction &frac);

像 a@ 这样的操作符的成员重载是这样的:

istream& operator>>(istream& is);

来源:en.cppreference.com

重载operator&gt;&gt; 的常用方法是这样写:

friend istream& operator>>(istream& is, Fraction& frac);

为什么不是会员?因为如果它是成员,你会这样写:

object >> stream;

这很烦人而且没用。

【讨论】:

  • 是的。我忘了用朋友作为运算符>>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 2012-10-05
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多