c++"<<"满载

c++"<<"重载
vector.h
#ifndef VECTOR_ARITHMETIC_H_
#define VECTOR_ARITHMETIC_H_
#include <iostream>
#include <cstdlib>
using namespace std;
//-------class Array------------
class Array
{
private:
int Size,*ptr;
public:
Array(int ArraySize=10);//构造函数
Array(Array &init);//拷贝构造函数
~Array();//析构函数
int GetSize();//接口函数
int operator==(Array &right);//重载==
Array &operator=(Array &right);//重载=
Array &operator+(Array &right);//重载+
Array &operator-(Array &right);//重载-

void Input();//数组输入
void Output();//数组输出
};
ostream &operator<<(ostream & out,Array &array)//重载运算符<<,不是成员函数
{
array.Output();
return out;
}
#endif//
vector.cpp
#include "vector_arithmetic.h"
//----构造函数----
Array::Array(int ArraySize)
{
Size=ArraySize;//数组默认大小为10
ptr=new int[Size];//为数组分配内存空间
for(int i=0;i<Size;i++)//数组初始化
{
ptr[i]=0;
}
}
//----拷贝构造函数---
Array::Array(Array &init)
{
Size=init.Size;//数组默认大小为10
ptr=new int[Size];//为数组分配空间
for(int i=0;i<Size;i++)
{
ptr[i]=init.ptr[i];
}
}
//----析构函数----
Array::~Array()
{
delete []ptr;//回收内存空间
}
int Array::GetSize()//接口函数
{
return Size;//获取向量大小
}
/*
     重载==
     判断两个向量是否相等:
         相等  返回1
 不相等   返回0
*/
int Array::operator==(Array &right)
{
if(Size!=right.Size)//数组不相等
{
return 0;
}
for(int i=0;i<Size;i++)
{
if(ptr[i]!=right.ptr[i])//数组不相等
{
return 0;
}
}
return 1;
}
//重载=
Array &Array::operator=(Array &right)
{
//检查是否自我复制
if(this!=&right)
{
delete[]ptr;//回收内存空间
Size=right.Size;//指定对象大小
ptr=new int [Size];//为数组复制分配空间
for(int i=0;i<Size;i++)
{
ptr[i]=right.ptr[i];
}
}
return (*this);//使其能连续执行x=y=z
}
//重载+
Array &Array::operator+(Array &right)
{
if(Size!=right.Size)
{
cout<<"数组维数不同不能相加!";
exit(1);
}
else
{
for(int i=0;i<Size;i++)
{
ptr[i]=ptr[i]+right.ptr[i];
}
}
return (*this);//使其连续执行x+y+z
}
//重载-
Array &Array::operator-(Array &right)
{
if(Size!=right.Size)
{
cout<<"数组维数不同,不能相减!";
exit(1);
}
else
{
for(int i=0;i<Size;i++)
{
ptr[i]=ptr[i]-right.ptr[i];
}
}
return (*this);
}
//向量输入
void Array::Input()
{
for(int i=0;i<GetSize();i++)
{
cout<<"第"<<i<<"个";
cin>>ptr[i];
}
}
//向量输出
void Array::Output()//数组输出
{
cout<<"内容为";
for(int i=0;i<GetSize();i++)
{
cout<<ptr[i]<<" ";
}
cout<<endl;
}
main.cpp
#include "vector_arithmetic.h"
int main()
{
Array s1(3),s2(3),s3(7);
    s1.Input();
cout<<s1;
return 0;
}
运行时出现一下问题:
vector_arithmetic.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@st

------解决思路----------------------
函数定义放到 cpp 中, h 里面只写一个声明就够了
------解决思路----------------------
同意1楼。

另外,你这个重载没有意义。因为你调用的是成员函数output(),而该函数始终输出到cout,不能输出到作为参数的任意流。
------解决思路----------------------
加一个 inline 即可

inline ostream &operator<<(ostream & out,Array &array)//重载运算符<<,不是成员函数
{
array.Output();
return out;
}



------解决思路----------------------
引用:
//重载+
Array &Array::operator+(Array &right)
{
}
Array前面加&是什么意思。。。


请搜索 引用