1

このクラスの「印刷」関数で正しい合計を取得するのに問題があります

class PRN {
private:
typedef pair < string, int > P;   
int sz, // map size – no of distinct words
cnt, // counter for printing
total; // no of words
public:
// constructor
PRN ( const int& s = 1, const int& c = 0, const int& t = 0 ){
    cnt= c;
    total = t;
        sz = s;        
}
void operator ( ) ( const P& p ){
    total += p.second;
    cout << total;
}// overloaded operator, where P is defined as
// typedef pair < string, int > P;

void print () const{
    cout <<"no of words in output list : " << total << endl;
}

};

それから私のメインで私は電話します

PRN p (m.size());
    for_each(m.begin(),m.end(),p);
    p.print();

m は、いくつかの値 (文字列、整数) を含むマップです。オペレーターはそれらを印刷しているため追加していますが、それらが追加されていることがわかりますが、 p.print() を呼び出すと、「合計」に対してゼロが返されます。

助言がありますか?ありがとう

4

1 に答える 1

2

問題は の動作にあります。標準では、作業中に が内部的にコピーfor_eachされないことを保証していません。その結果、状態を持つこのような関数のようなオブジェクトは、通常、標準ライブラリ関数ではうまく機能しません。個人的には、この動作は奇妙で、関数のようなオブジェクトを持つことの多くのポイントを損なうと常に思っていましたが、それは私たちが対処した手です.for_eachp

total使用方法に応じて、 の静的メンバーを作成することで、必要な動作を多かれ少なかれ取得できる場合があります。これにより、すべてのオブジェクトが使用する場所にPRN1 つの値のみが存在します。欠点は、次がゼロから開始するのではなく、中断したところから再開することですが、コンストラクターをゼロにリセットするなどのことを行うことでそれを軽減できる場合があります (オブジェクトが非常に長く存続せず、使用される場所のすぐ近くで作成されます)。totalPRNfor_eachPRNtotalPRN

もう 1 つの可能性はPRN、次のように、実際に合計を含む別のオブジェクトへのポインターをオブジェクトに含めることです。

class PRN
{
private:
    struct Storage
    {
        int total;
    };

    Storage *s;
public:
    PRN():
        s(new Storage)
    {
    }

    ~PRN()
    {
        delete s;
    }

    void operator()(const P& p)
    {
        s->total += p.second;
        ...
    }

    ...
};

このアプローチを使用すると、コピーがオリジナルと同じ Storage オブジェクトを指すため、コピーがfor_each存在するかどうかは問題ではありません。p

于 2013-10-02T03:55:03.290 に答える