C++での入出力演算子のオーバーロード
C++学習者です。Visual Studio 2015 を使っています。
入力演算子>> と出力演算子<<をオーバーロードする関数をfriend としてクラス定義の中に書きましたが、”メンバーではありません” というメッセージが出てきてコンパイルできません。
エラー番号はC2039です。
何回調べても原因がわからないので、詳しい方にお聞きしたいです。
どうかよろしくお願いいたします。
ヘッダーファイルと関数定義ファイル、クライアントプログラムと、エラーメッセージのコピーを張り付けてあります。
// クラスヘッダーファイル
// class Array header
#ifndef ARRAY1_H
#define ARRAY1_H
#include <iostream>
using namespace std;
class Array {
// operator overloading as non-member functions
friend ostream &operator<<(ostream &, const Array &);
friend istream &operator>>(istream &, Array &);
public:
Array(int = 10); // constructor with default of 10 elements of array
Array(const Array &); //copy constructor
~Array(); // destructor
int getSize() const; // size of array
// operator overloadings as member functions
const Array &operator=(const Array &); // assignment
bool operator==(const Array &) const; // check equality of two arrays
// because both sides of the operator are constant,
// this function must be constant too
bool operator!=(const Array &right) const {
// fully defined function in the header file like this one
// will be made in-line function and save overhead time
return !(*this == right);
}
int &operator[](int); // check subscript range for non-constant array
const int &operator[](int) const; // check subscript range for constant array
// remember we can only invoke constant function of a constant object
// so if we want to check the subscript range of a constant object, we need
// to use a constant member function of that object, that's why we need a
// constant version of the same functionn as above operator[]
private:
int size; // size of array
int *ptr; // pointer to the first element of the array
// so ptr is the name of the array
}; // end of class Array definition
#endif
// 関数定義ファイル
// array1.cpp
// member function definitions of class Array
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
using std::cout;
#include <new> // for new and delete
#include <cstdlib> // for exit()
using std::exit;
#include "array1.h"
// >> , << 以外のオーバーロード関数は省略します
// input operator overloading
istream &Array::operator>>(istream &input, Array &a)
{
for (int i = 0; i < a.size; i++)
input >> a.ptr[i];
return input;
}
// output operator overloading
ostream &Array::operator<<(ostream &output, const Array &a)
{
int i;
for (i = 0; i < a.size; i++)
{
output << setw(12) << a.ptr[i];
if ((i + 1) % 4 == 0)
output << endl;
}
if (i % 4 != 0)
output << endl;
return output;
}
// クライアントプログラム
// ConsoleApplication87.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "array1.h"
int main()
{
Array integers1(7); // 7 elements array
Array integers2; // default 10 element array
cout << "size of array integer1 is " << integers1.getSize() << endl;
cout << "contents of integers1 after instantiation are :\n";
cout << integers1;
cout << "---------------------------------------------\n";
cout << "size of array integers2 is " << integers2.getSize() << endl;
cout << "contents of integers2 after instantiation are :\n";
cout << integers2;
cout << "---------------------------------------------\n";
return 0;
}
// エラーメッセージ
1>------ ビルド開始: プロジェクト:ConsoleApplication87, 構成:Debug Win32 ------
1> array1.cpp
1>c:\users\shiro\documents\visual studio 2015\projects\consoleapplication87\consoleapplication87\array1.cpp(96): error C2039: '>>': 'Array' のメンバーではありません。
1> c:\users\shiro\documents\visual studio 2015\projects\consoleapplication87\consoleapplication87\array1.h(9): note: 'Array' の宣言を確認してください
1>c:\users\shiro\documents\visual studio 2015\projects\consoleapplication87\consoleapplication87\array1.cpp(104): error C2039: '<<': 'Array' のメンバーではありません。
1> c:\users\shiro\documents\visual studio 2015\projects\consoleapplication87\consoleapplication87\array1.h(9): note: 'Array' の宣言を確認してください
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
お礼
ご返答&チェックありがとうございます! ただ、NULLを避けて入出力できるようにするだけなの ですが説明不足ですみませんです、、