4
#include<iostream>
using namespace std;
class term
{
public:
    int exp;
    int coeff;  
};
class poly
{
public:
    term* term_ptr;
    int no_term;

    poly(int d);
    friend istream& operator>>(istream& in, poly& p);
    friend ostream& operator<<(ostream& out, const poly& p);
    friend poly operator+(const poly& p1, const poly& p2);
};
poly::poly(int d=0)
{
    no_term = d;
    term_ptr = new term[no_term];
}
istream& operator>>(istream& in, poly& p)
{
    in>>p.no_term;
    for(int i= 0; i<p.no_term; i++)
    {
        in>>(p.term_ptr+i)->coeff;
        in>>(p.term_ptr+i)->exp;
    }
    return in;
}

オブジェクトを入力するために入力演算子をオーバーロードしました。私が直面している問題は、2つのオブジェクトを入力すると、最初のオブジェクト入力のデータメンバーが変化することです。

int main(void)
{
    poly p1, p2;
    cin>>p1;
    cin>>p2;
    cout<<p1;
    cout<<p2;
    return 0;   
}

入力が

 3
 1 1
 1 2
 1 3
 3
 1 1
 1 2
 1 3

私が得る出力は

1 1
1 2 
1 1
1 1
1 2
1 3

出力演算子関数は

ostream& operator<<(ostream& out, const poly& p)
{
    out<<"coeff"<<" "<<"power"<<endl;
    for(int i = 0; i< p.no_term; i++)
        out<<(p.term_ptr+i)->coeff<<" "<<(p.term_ptr+i)->exp<<endl;
    return out;
}
4

3 に答える 3

2

最初に、要素がゼロの配列を割り当てます。オブジェクトを読み取るときは、用語の数を読み取りますが、用語の配列を再割り当てしません。個人的には、適切なコンテナタイプを使用することをお勧めします。たとえば、std::vector<term*>実際にはstd::vector<std::shared_ptr<term>>。配列に固執する場合は、次のようなものが必要になります。

std::istream& operator>>(std::istream& in, poly& p)
{
    if (in>>p.no_terms ) {
        std::unique_ptr<term[]> terms(new term[p.no_terms]);
        for(int i= 0; i<p.no_term; i++)
        {
            in >> terms[i].coeff;
            in >> terms[i].exp;
        }
        if (in) {
            delete[] p.term_ptr;
            p.term_ptr = terms.release();
        }
    }
    return in;
}
于 2012-10-19T06:22:01.347 に答える
1

に変更poly p1, p2;poly p1(3), p2(3);ます。

p.no_termの値はですが、コンストラクター3を見てください。poly

poly::poly(int d=0)
{
    no_term = d;
    term_ptr = new term[no_term];
}

長さの配列を作成してい0ます。また、コードでポインタを使用する必要はありません。以下を使用した例を次に示しstd::vector<term>ます。

#include<iostream>
#include <vector>
using namespace std;
class term
{
    public:
    int exp;
    int coeff;  
};
class poly
{
    public:
    std::vector<term> term_vec;
    int no_term;

            poly(int d);
            friend istream& operator>>(istream& in, poly& p);
            friend ostream& operator<<(ostream& out, const poly& p);
            friend poly operator+(const poly& p1, const poly& p2);
};
poly::poly(int d=0) : term_vec(d), no_term(d)
{
}
istream& operator>>(istream& in, poly& p)
{
    in>>p.no_term;
    p.term_vec.resize(p.no_term);
    for(int i= 0; i<p.no_term; i++)
    {
        in>> p.term_vec[i].coeff;
        in>> p.term_vec[i].exp;
    }
    return in;
}

  ostream& operator<<(ostream& out, const poly& p)
   {
    out<<"coeff"<<" "<<"power"<<endl;
    for(int i = 0; i< p.no_term; i++)
    out<<p.term_vec[i].coeff<<" "<<p.term_vec[i].exp<<endl;
    return out;
   }

   int main(void)
 {
    poly p1, p2;
    cin>>p1;
    cin>>p2;
    cout<<p1;
    cout<<p2;
    return 0;   
 }
于 2012-10-19T06:20:37.633 に答える
0

デフォルトのコンストラクター引数のd値はです0。次に、を呼び出しますnew term[0]。長さが0の配列として初期化されるポインターは、例の同じ場所にポイントされます。無効なメモリを埋めた後、同じ結果が表示されます。

于 2012-10-19T06:21:58.337 に答える