2017-01-23 7 views
0

私はメインの行に問題があります。演算子のオーバーロード=、* =。この作品を作るには?

* tab [1] = test1;
* tab [4] = test2; 色を追加するだけで、変数(a、b、h)は同じままです。私はこの

cuboid operator=(const cuboid & base) 
{ 
return cuboid(base.colour(), base.valueA(), base.valueB(),base.h_) 
} 

ような何かをしようとしていたが、これは動作していないようですどちらか

次のものがこれです:

*タブ[4] * = 2;

このメソッドにはオーバーロードされた演算子があり、これを実行するとエラーが発生します。演算子* =は一致しません。オペランドの型はFigureとintです。

最後のものは:* tab [2] = "bright" + * tab [2];私はこれに新しいコンストラクタが必要だと思いますが、どこで作っていますか?

ありがとうございました!あなたは、配列figure* tab[5]を定義している

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <math.h> 
using namespace std; 
class figure 
{ 
string * colour_; 
public: 
figure(): colour_(new string("Empty")) {} 
figure(const string & colour): colour_(new string(colour)) {} 
figure(const figure & base) 
{ 
    colour_=new string(*base.colour_); 
} 
virtual ~figure() {delete colour_;} 
string & colour() const {return *colour_;} 
virtual double area() =0; 
virtual void print(ostream& where) const 
{ 
where << "Colour: " << colour() << " "; 
} 
friend ostream & operator <<(ostream &os, const figure & base) 
{ 
base.print(os); 
return os; 
} 
figure & operator=(const figure & base) 
{ 
if(this==&base) 
    return *this; 
else 
{ 
colour_=new string(*base.colour_); 
return *this; 
} 
} 

}; 
class circle :public figure 
{ 
int r_; 
public: 
circle() : r_(0) {} 
circle(const string & colour,const int r) : figure(colour), r_(r) {} 
double area() 
{ 
    return M_PI*r_*r_; 
} 
const int & radius() const {return r_;} 
void print(ostream& where) const 
{ 
where << "Colour: " << colour() << " "; 
where << "Radius: " << radius() << " "; 
} 
circle & operator=(const circle & base) 
{ 
    r_=base.r_; 
    figure::operator=(base); 
    return *this; 
} 

}; 
class rectangle : public figure 
{ 
int a_; 
int b_; 
public: 
static int ObjectCount_; 
rectangle() : a_(0), b_(0) {++ObjectCount_;} 
rectangle(const string & colour, const int a, const int b) : figure(colour),a_(a), b_(b) {++ObjectCount_;} 
~rectangle() {--ObjectCount_;} 
double area() 
{ 
    return a_*b_; 
} 
const int & valueA() const {return a_;} 
const int & valueB() const {return b_;} 
int & changeA() {return a_;} 
int & changeB() {return b_;} 
void print(ostream& where) const 
{ 
where << "Colour: " << colour() << " "; 
where << "Value A: " << valueA() << " "; 
where << "Value B: " << valueB() << " "; 
} 
rectangle & operator=(const rectangle & base) 
{ 
    a_=base.a_; 
    b_=base.b_; 
    return *this; 
} 
static int & ObjectCount() {return ObjectCount_; } 

}; 
class cuboid :public rectangle 
{ 
int h_; 
public: 
cuboid() : h_(0) {} 
cuboid(const string & colour, const int a, const int b, const int h) : rectangle(colour,a,b), h_(h) {} 
double area() 
{ 
    return 2*valueA()*valueB()+2*valueB()*h_+2*valueA()*h_; 
} 
void print(ostream& where) const 
{ 
where << "Colour: " << colour() << " "; 
where << "Value A: " << valueA() << " "; 
where << "Value B: " << valueB() << " "; 
where << "Height: " << h_ << " "; 
} 

cuboid & operator=(const cuboid & base) 
{ 
figure::operator=(base); 
rectangle::operator=(base); 
h_=base.h_; 
return *this; 
} 

cuboid & operator*=(const int number) 
{ 
h_*=number; 
changeA()*=number; 
changeB()*=number; 
return *this; 
} 
}; 
int rectangle::ObjectCount_=0; 
int main() 
{ 
figure * tab[5]; 

const circle test1("black",100); 
const cuboid test2("grey", 2,2,2); 

tab[0]=new circle("red",1); 
tab[1]=new circle; 
tab[2]=new rectangle("blue",1,1); 
tab[3]=new cuboid("green",1,1,1); 
tab[4]=new cuboid; 

for(unsigned i=0; i<5;++i) 
cout << tab[i]->area() << endl; 
for(int i=0; i<5; ++i) 
cout<<*tab[i]<<tab[i]->area()<<"\n"; 
cout << "***********************" << endl; 
*tab[1]=test1;     // it just assigns a colour, rest stays the same 
*tab[4]=test2;     // same here 
/* 
*tab[2] = "bright" + *tab[2]; //????? 
*/ 
//*tab[4]*=2;     //some error, no idea 

for(int i=0; i<5; ++i) 
cout<<*tab[i]<<tab[i]->area()<<"\n"; 
cout << "$ " << rectangle::ObjectCount() << endl; 
for(int i=0; i<5; i++) 
delete tab[i]; 
cout << "$ " << rectangle::ObjectCount() << endl; 
} 
+1

ようこそスタックオーバーフロー!最初に[ツアー(http://stackoverflow.com/tour)に参加して[良い質問をする方法](http://stackoverflow.com/help/how-to-ask)を学んで[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例を参照してください。そうすれば、私たちがあなたを助けやすくなります。 –

答えて

0

、そうしてあなたはfigure*にあなたのオブジェクトへのすべてのポインタをキャストしているassigmentsます

figure & operator=(const figure & base) { 
    if(this==&base) 
     return *this; 
    else { 
     colour_=new string(*base.colour_); 
     return *this; 
    } 
} 

tab[0]=new circle("red",1); 
tab[1]=new circle; 
tab[2]=new rectangle("blue",1,1); 
tab[3]=new cuboid("green",1,1,1); 
tab[4]=new cuboid; 

をクラスfigureにのみ、このassigment演算子を持っています

だから、あなたはやっている:

*tab[1]=test1; 
*tab[4]=test2; 

あなたはclass figureからそのassigment演算子を呼び出しています。

operator *=と同じです。クラスfigureはちょうど 持っていません。それはなぜあなたが間違っているのですか?

関連する問題