2017-07-25 5 views
-3
#include <iostream> 
using namespace std; 

class station{ 
    int n; 
    float *p; 
public: 
    station(){}; 
    station(const station &ob){cout<<"Copy";} 
    station operator=(station* a){cout<<"Nai";} 
    ~station(){cout<<"Destructor";} 
    static float counter; 
    friend istream &operator>(istream &stream, station &d); 
    int &getN(){return n;}; 
    float *&getP(){return p;}; 
    void* operator new[](size_t size); 
    void* operator new(size_t size){station *a;a=::new station;return a;}; 


}; 
void* station::operator new[](size_t size){ 
    station* a; 
    a=(::new station[size]); 
    int b; 
    b=(size)/(sizeof(station)); 
    for(int i=0;i<b;i++){ 
     cin>a[i]; 
    } 
    cout<<a; 
    return a; 
} 



float station::counter; 
istream &operator>(istream &stream, station &d){ 
    cout<<"Dwse arithmo deigmatwn"; 
    int num; 
    stream>>num; 
    d.getP()=new float[num]; 
    d.getN()=num; 
    for(int i=0;i<num;i++){ 
     stream>>d.getP()[i]; 
    } 
    return stream; 
} 



int main(){ 
    station* a; 
    a=new station[2]; 
    cout<<a; 
    return 0; 
} 

こんにちは皆、 これは私の最初の投稿ですので、私の間違いを許してください。新しい返信が間違っているアドレス

新しい演算子と抽出子のオーバーロードで新しいクラスを作成しました。私の問題は、newによって返されるアドレスが、cout<<aが記述されている行で見ることができるように、オーバーロードされた演算子の中にあるアドレスとは異なることです。しかし、私がデストラクタを消去すると、すべて正常になります。何か案は?

+3

入力ストリームに対してより大きい比較演算子をオーバーロードするのはなぜですか? –

+0

私はちょうどオーバーロード演算子で運動しています。 –

+1

それで、あなたは間違ったことをする方法を行使していますか? –

答えて

3

new[]演算子を使用すると、コンパイラは内部簿記用に余分なスペースを割り当てることができます(たとえば、配列サイズを格納するため、delete[]を呼び出すときに、オブジェクトの数が分かります)。これは、「生の」割り振りと最後の配列割り振りオブジェクトアドレスの間に見られる違いです。

によって割り当てられたメモリにdeleteを呼び出すべきではなく、逆にメモリリーク(拳オブジェクトのみが破壊される)、無効なデータにアクセスしたり、悪いポインタを解放したりする理由があります。 (技術的にすべてのUB)。オブジェクトの内容の問題については


EDIT

、あなたは、オペレータが新しい/新しい[]だけですoperator new[]

このような
for(int i=0;i<b;i++){ 
    cin>a[i]; 
} 

内のオブジェクトを初期化することになっていません「生」メモリを割り当てる。

単純例えば、これを削除し、(コンストラクタは、アレイ内の各オブジェクトに対してコンパイラによって自動的に呼ばれている)したい場合は、コンストラクタでオブジェクトを読み取る:

station(){cin >> *this}; // or '>' if you really want to keep that 

しかし、一般的には、読書をストリームからは通常明示的に行われるため、たとえば

a=new station[2]; 
for(int i=0;i<2;i++){ 
    cin>a[i]; 
} 

main()のようにすることができます。

+0

しかし、オブジェクトの関数を使ってデータにアクセスしようとすると、ごみ! –

+1

これは、 'for(int i = 0; i a [i];}' - あなたは 'operator new'でオブジェクトを初期化することは想定されていないので、それはコンストラクタで行います。 – axalis

関連する問題