【问题标题】:Using cin >> and cout << to populate fields of a class C++使用 cin >> 和 cout << 填充 C++ 类的字段
【发布时间】:2017-03-15 22:12:41
【问题描述】:

我在MyClass.h 中有一个类定义如下:

#ifndef MyClass_h
#define MyClass_h

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

class MyClass {
public:
    string input
    void ReadFrom(istream &is);
    void WriteTo(ostream &os) const;
};
#endif /* MyClass_h */

MyClass.cpp 看起来像这样:

#include <stdio.h>
#include <string>
#include <iostream>
#include "MyClass.h"

using namespace std;

void MyClass::ReadFrom(istream &is) {
    // put data into member 'input'
}

void MyClass::WriteTo(ostream &os) const {
    // output data in member 'input'
}

istream& operator >>(istream &is, MyClass &cls) {
    cls.ReadFrom(is);
    return is;
}

ostream& operator <<(ostream &os, const MyClass &cls) {
    cls.WriteTo(os);
    return os;
}

main.cpp 看起来像这样:

#include <stdio.h>
#include <string>
#include <iostream>
#include "MyClass.h"

using namespace std;

int main(int argc, const char * argv[]) {
   MyClass c;
   std::cout << "Enter some input" << endl;
   std::cin >> c;
   return 0;
}

我想要完成的是重写&gt;&gt;&lt;&lt; 运算符,以便std::cin 可以简单地将数据读入类成员,然后std::cout 可以吐出所有数据在那些成员中。

我不想使用friend 函数。

现在,我在 std::cin &gt;&gt; c; 行周围收到一条错误消息:

二进制表达式的无效操作数('istream' (aka 'basic_istream') 和 'MyClass')

【问题讨论】:

  • 恕我直言,不要试图对重载过于聪明通常是个好主意。也许您真正想要的是一个构造函数,它获取您从用户那里读取的数据,一旦您知道您拥有构建对象所需的数据,您就可以显式调用它。

标签: c++ class operator-overloading


【解决方案1】:

编译器无法在您的main.cpp 翻译单元中看到运算符重载,因为在该文件中找不到重载,也没有在任何#include 文件中找到它们。您需要在 MyClass.h 文件中声明这两个重载,而不是在 MyClass 声明之后:

MyClass.h:

#ifndef MyClass_h
#define MyClass_h

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

class MyClass {
public:
    string input
    void ReadFrom(istream &is);
    void WriteTo(ostream &os) const;
};

istream& operator >>(istream &is, MyClass &cls);    
ostream& operator <<(ostream &os, const MyClass &cls);

#endif /* MyClass_h */

您可以将定义保留在您的 MyClass.cpp 文件中。

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多