#ifndef Vector_VectorCpx_h
#define Vector_VectorCpx_h

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <limits>
using namespace std;

// Complex definition -------------------------------------
class Complex
{
    private:
	    double mReal, mImag;
    
	public:
		Complex(double _real = 0, double _imag = 0);
		const double& real() const;
		const double& imag() const;
		void real(double value);
		void imag(double value);
		Complex operator+(const Complex& cpx) const;
		Complex operator-(const Complex& cpx) const;
		Complex operator*(const Complex& cpx) const;
		Complex operator/(const Complex& cpx) const;
};
ostream& operator<<(ostream& ostr, const Complex& cp);

// Vector of complex definition -------------------------------------
class VectorCpx
{
	protected:
		Complex *pCpx;
		unsigned mSize, mCapacity;
	public:
		VectorCpx(unsigned _n = 0, const Complex& cpx = Complex(0) );
		VectorCpx(const VectorCpx& v);
		~VectorCpx();
		unsigned size() const;
		unsigned capacity() const;
		const Complex& operator[](int i) const;
		Complex& operator[](int i);
		VectorCpx& push_back(const Complex& cpx);
		VectorCpx& resize(unsigned _n, const Complex& cpx = Complex(0));
		VectorCpx operator*(const Complex& cpx)const;
		Complex operator*(const VectorCpx& v);
		VectorCpx& operator=(const VectorCpx& v);
		virtual VectorCpx& operator>>(fstream& file);
		virtual VectorCpx& operator<<(fstream& file);
};
VectorCpx operator*(const Complex& cpx, const VectorCpx& v);
ostream& operator<<(ostream& ostr, const VectorCpx& v);

class AdvVectorO:virtual public VectorCpx
{
	public:
		AdvVectorO(unsigned number = 0, const Complex& input = Complex(0));	//constructor
		AdvVectorO(const VectorCpx& vec);	//copy constructor
		virtual AdvVectorO& operator>>(fstream& file);
};

class AdvVectorI:virtual public VectorCpx
{
	public:
		AdvVectorI(unsigned number = 0, const Complex& input = Complex(0));	//constructor
		AdvVectorI(const VectorCpx& vec);	//copy constructor
		virtual AdvVectorI& operator<<(fstream& file);
};

class AdvVectorIO:public AdvVectorI, AdvVectorO
{
	public:
		AdvVectorIO(unsigned number = 0, const Complex& input = Complex(0));	//constructor
		AdvVectorIO(const VectorCpx& vec);	//copy constructor
		virtual AdvVectorIO& operator>>(fstream& file);
		virtual AdvVectorIO& operator<<(fstream& file);
};

/*
因為在VectorCpx、AdvVectorO、AdvVectorI、AdvVectorIO中，都要自定義">>"和"<<"
如果只是單純的讓AdvVectorO、AdvVectorI繼承VectorCpx，又讓AdvVectorIO繼承AdvVectorO、AdvVectorI，會造成程式執行時不知道要看哪邊的定義
因此必須在這四個class裡定義">>"、"<<"的函式前面都加上"virtual"，讓他們成為虛擬函式，就可避免這個問題

不過VC++2010還是不會給過，Dev C就會給過，見鬼了
*/

#endif
