#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