2016-06-23 5 views
-4
class a{ 
    int *var = new int; 
public: 
    //constructor and destructor 
    a(int a):var(new int(5)){} 
    ~a() {delete var;} 


    int get() const {return *var} 
    //overload of + oporator 
    a operator+(const a & rhs){return a(*var+rhs.get() 
    //overload of ++ operator 
    a a::operator++ (int) 
} 

a a::operator+ (const a & rhs) { 
    return a(*itsRadius + rhs.get()); 
} 
a a::operator++ (int){ 
    a temp(*this); 
    *itsRadius= *itsRadius+1; 
    return temp;} 

} 

に+演算子をオーバーロードします。 なぜですか?は、どのように今、ヒープ割り当てられたVAR

私がエラーを受け取ったとき(彼が削除しようとすると、ディストラクタで)、どうしてですか?

+0

なぜintの代わりにintポインタがありますか? – tkausl

+1

このコードは駄目です。読みにくい。 – Boiethios

+0

@tkausl私はそれが内部に割り当てられたリソースで新しいオブジェクトを作成する方法を理解するための例であると思います。 – Boiethios

答えて

1

ここでは動作例です。あなたはrule of threeについて読むことも必要があります。

#include <iostream> 

class Int 
{ 
    int *_value; 

public: 
    Int(int value) : _value(new int(value)) 
    { 
    } 
    ~Int() 
    { 
     delete _value; 
    } 
    Int(Int const &rhs) : _value(new int(*rhs._value)) 
    { 
    } 
    Int & operator=(Int const &rhs) 
    { 
     *_value = *rhs._value; 
     return *this; 
    } 

    Int operator+(Int &rhs) const 
    { 
     return Int(*rhs._value + *_value); 
    } 

    operator int() const 
    { 
     return *_value; 
    } 
}; 

int main(void) 
{ 
    Int a(10), 
     b(32), 
     c(a + b); 

    std::cout << c << "\n"; 
    a = c; 
    std::cout << a << "\n"; 
} 

そしてまた、C++での生Cのポインタを使用することは悪い考えです。 std::unique_ptrについて読む

0

o.k.今

class SimpleCircle { 

int *itsRadius; 

public: 

SimpleCircle():itsRadius(new int(5)) { cout << "constructor initialized" << endl;} 
SimpleCircle(int num) { itsRadius = new int(num); cout << "constructor" << endl;} 
SimpleCircle(const SimpleCircle &rhs) : itsRadius(new int(*rhs.itsRadius)){ cout << "copy constructor" << endl; } 
~SimpleCircle(){ delete itsRadius; cout << "destructor" << endl;} 


//perfect 
int get() const {return *itsRadius;} 
void set(int num) { *itsRadius = num;} 
//------- 


//plus operator 
SimpleCircle operator+(const SimpleCircle &); 

//inc operator 
SimpleCircle operator++(); 
SimpleCircle operator++(int); 

//= operator 
SimpleCircle & operator=(const SimpleCircle &); 
}; 




SimpleCircle SimpleCircle::operator+ (const SimpleCircle & rhs) { 
return SimpleCircle(*itsRadius + *rhs.itsRadius); 
} 

SimpleCircle SimpleCircle::operator++() { 
int a = *itsRadius; 
++a; 
*itsRadius=a; 
return *this; 
    } 

SimpleCircle SimpleCircle::operator++ (int){ 
SimpleCircle temp(*this); 
*itsRadius= *itsRadius+1; 
return temp; 
} 


SimpleCircle & SimpleCircle::operator= (const SimpleCircle & rhs) { 
if (this == &rhs) 
    return *this; 

*itsRadius = *rhs.itsRadius; 
return *this; 
    } 

int main() 
{ 

SimpleCircle a; 
cout << a.get() << endl; 

SimpleCircle b(15); 
cout << b.get() << endl; 

    SimpleCircle c = a + b; 

cout << "a: "<< a.get() << endl; 
cout << "b: " << b.get() << endl; 
cout << "c: " << c.get() << endl; 

a++; 
cout << "a: " << a.get() << endl; 
++a; 
    cout << "a: " << a.get() << endl; 

iは2の問題は 1cは代わりに、いくつかのgarbegeに等しかった(すなわちoutherの1 becoaseた)を有していた元のコードで理由:私は問題を解決するため、これは作業コードであります数 2エンドデストラクタでプログラムブレーク

は、理由はそれが治療する方法を知りませんでしたので、私はforgat O、演算子=を追加しました:

C = A + B;

私はそれを修正した後、すべて一緒にきれいに集まる

+0

'int a = * itsRadius; ++ a;* itsRadius = a; 'ワオ。 '++ * itsRadius'で十分です。 – Boiethios

+0

清潔なペペシェのために... –

+0

haha​​ ... clearety ... – Boiethios

関連する問題