【问题标题】:Operator overloading function in class c++c++ 类中的运算符重载函数
【发布时间】:2023-03-17 08:00:01
【问题描述】:

这是我的独立运算符重载函数。

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

typedef vector <string> record_t;
typedef vector <record_t> data_t;

istream& operator >> ( istream& ins, record_t& record )
  {

  record.clear();
  string line;
  getline( ins, line );
  stringstream ss( line );
  string field;
  while (getline( ss, field, '\t' ))
    {
    stringstream fs( field );
    string f("");  // (default value is 0.0)
    fs >> f;
    record.push_back( f );
    }
  return ins;
  }

istream& operator >> ( istream& ins, data_t& data )
  {

  data.clear();
  record_t record;
  while (ins >> record)
    {
    data.push_back( record );
    }
  return ins;  
  }

int main()
  {
  // Here is the data we want.
  data_t data;

  ifstream infile( "split.idx" );
  infile >> data;

  if (!infile.eof())
    {
    cout << "Fooey!\n";
    return 1;
    }

  infile.close();

  // Otherwise, list some basic information about the file.
  cout << "Your CSV file contains " << data.size() << " records.\n";

  return 0;
  }

这里有两个运算符重载函数。

istream& operator >> ( istream& ins, record_t& record )
istream& operator >> ( istream& ins, data_t& data )

现在我希望以 Class 格式编写函数。所以我在名为(“Headers.h”)的头文件中声明了typedef数据和记录变量

typedef vector <string> record_t;
typedef vector <record_t> data_t;

现在我写了一个类。 FileHandler1.h

#ifndef _FILEHANDLER
#define _FILEHANDLER
#endif

class FileHandler1
{

    public : 


        istream& operator >> ( istream& ins, record_t& record );

        istream& operator >> ( istream& ins, data_t& data );

};

文件处理程序1.cpp

#include "Headers.h"
#include "FileHandler1.h"
istream& FileHandler1:: operator >> ( istream& ins, record_t& record )
{
//Same set of code I posted initially 
}

istream& FileHandler1:: operator >> ( istream& ins, data_t& data )
{
// Same set of code  
}

现在我得到以下错误。

错误:'std::istream& FileHandler1::operator>>(std::istream&, record_t&)' 必须只有一个参数

我该如何修复这个错误?

【问题讨论】:

  • 这不是问题,但不要使用以下划线后跟大写字母 (_FILEHANDLER) 或包含两个连续下划线的名称。它们保留给实现。

标签: c++ class arguments operator-overloading


【解决方案1】:

二元运算符,例如operator&gt;&gt;,可以实现为非成员函数或成员函数。当它作为非成员函数实现时,它需要两个参数,比如说TU。当它作为成员函数实现时,它接受一个参数 - 只是 U - 左操作数是它所属的类的类型。

即做t &gt;&gt; u,其中operator&gt;&gt;T的成员,调用t.operator&gt;&gt;(u)

在这里,您试图使operator&gt;&gt; 成为FileHandler1 的成员,即使&gt;&gt; 的左操作数不是该类型。如果您被允许,则操作员必须是istream 的成员,但这不取决于您,因为它是标准类型。您必须将这些函数实现为非成员函数。

如果您确实拥有FileHandler1operator&gt;&gt; 成员,则必须使用单个参数声明它:

FileHandler1& operator >> ( U& right_operand );

然后您必须将它与FileHandler1 对象一起用作左操作数:

FileHandler1 fh;
U u;
fh >> u; // Equivalent to fh.operator>>(u)

【讨论】:

  • 很好的解释。我明白我现在需要什么了。
【解决方案2】:

类中的输入操作符用于当类实例输入流时。例如。在你的情况下:

FileHandler1 fh1;
fh1 >> something;

以上翻译为:

fh1.operator>>(something);

这就是成员输入运算符只接受一个参数的原因,这是错误消息告诉你的。

这似乎不是您想要的,因此您必须将输入运算符保留为独立函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多