2016-05-21 9 views
-3

私はC++学習の初心者で、 '< <'と '>>'についていくつか質問があります。 なぜcoutの結果が正しくないのですか?同時に、私はcの座標を入力した後、プログラムは凍結しました。 コード:C++演算子のオーバーロードについての質問

class Vector 
{friend istream &operator >> (istream &is,Vector &vec); 
friend ostream &operator << (ostream &os,Vector &vec); 
private: 
    int num; 
    double *cor; 
public: 
    Vector(int n=0,double *c=NULL);// 
}; 
int main() 
{ double b[5]={1,2,3,4,5}; 
    Vector a(5,b); 
    cout<<a; 
    Vector c(2); 
    cin>>c; 
} 
Vector::Vector(int n,double *c) 
{ 
    num=n; 
    double *cor=new double[num]; 
    if (c) { 
     for (int i=0;i<n;i++) {cor[i]=c[i];cout<<cor[i]<<endl;} 
    } 
} 
istream &operator >> (istream &is,Vector &vec) 
{ cout<<"Input the coordinate:"; 
    for (int i=0;i<vec.num;i++) 
     is>>vec.cor[i]; 
    return is; 
} 
ostream &operator << (ostream &os,Vector &vec) 
{ 
    for (int i=0;i<vec.num;i++){ 
     os<<vec.cor[i];} 
    return os; 
} 
+0

問題とは無関係です。ストリーミングオペレータは通常、ユーザーと対話しません。あなたの実装はファイルから読み込んでいてもメッセージを出力します。 – molbdnilo

答えて

1
double *cor=new double[num]; 

あなたはメンバーcorを初期化していない、corという名前のローカル変数を宣言しています。それは次のようになります。

実際のコードでただし
cor = new double[num]; 

、あなたはdelete S(なし追加のオーバーヘッドで)自動的に配列double配列にunique_ptrを使用します。

#include <iostream> 
#include <memory> // for unique_ptr 

using namespace std; 

class Vector { 
public: 
    Vector(int = 0, double* = nullptr); 

private: 
    friend istream& operator>>(istream&, Vector& vec); 
    friend ostream& operator<<(ostream&, Vector& vec); 

    int num; 
    unique_ptr<double[]> array; 
}; 

int main() { 
    double b[] = {1, 2, 3, 4, 5}; 

    Vector a(5, b); 
    cout << a; 

    Vector c(2); 
    cin >> c; 
} 

Vector::Vector(int n, double* c) { 
    num = n; 
    array = make_unique<double[]>(n); // in C++14 
    //array = unique_ptr<double[]>(new double[n]); // in C++11 

    if (!c) return; 

    for (int i = 0; i < n; i++) { 
     array[i] = c[i]; 
     cout << array[i] << endl; 
    } 
} 

istream& operator>>(istream& is, Vector& vec) { 
    cout << "Input the coordinates: "; 
    for (int i = 0; i < vec.num; i++) 
     is >> vec.array[i]; 
    return is; 
} 

ostream& operator<<(ostream& os, Vector& vec) { 
    for (int i = 0; i < vec.num; i++) 
     os << vec.array[i]; 
    return os; 
} 
+1

OPのコードにもメモリリークがあります。彼はデストラクタを定義していない。 – Destructor

+0

はい。デストラクタがあっても、デフォルトのコピー/移動コンストラクタは二重削除を引き起こします。正しい方法は、 'new' /' delete'ナンセンスを削除し、 'unique_ptr 'を使うことです。 – emlai

+0

正確に。これは最高の解決策です! – Destructor

0

小重要なヒント: 'const'を使用:

> ostream &operator << (ostream &os,const Vector &vec) 

vecは参照で受信されており、あなたはそれを変更しないためです。

関連する問題