0

クラスがあります

template<typename T> class RGBHistogramTrait
{
public:
    RGBHistogramTrait(const QImage &image, RGBHistogram<T> hist) : _hist(hist), _base((QRgb *) (image.bits()));
private:
    const QRgb *_base;
    RGBHistogram<T> _hist;
};

template<typename T> struct RGBHistogram
{
    RGBHistogram<T>(Histogram<T> &redHist, Histogram<T> &greenHist, Histogram<T> &blueHist)
        : redHist(redHist), greenHist(greenHist), blueHist(blueHist) {}

    Histogram<T> &redHist, &greenHist, &blueHist;
};

今、私は単一のオブジェクト RGBHistogram を持っています。RGBHistogramTrait のインスタンスを 100 個ほど作成したいのですが、RGBHistogramTrait の各インスタンスは RGBHistogram のコピーを作成する必要があり、各インスタンスはスレッドによって使用されます。

100 スレッドの結果を元の RGBHistogram に集約します。問題は、RGBHistogramTrait の各インスタンスの _hist が何らかの形で同じもの (元の RGBHistogram) を指していることです。RGBHistogramTrait のコンストラクターで _hist(hist) を使用して、既に RGBHistogram を浅くコピーしたと思います。RGBHistogram には std::map があり、コピー コンストラクターは定義されていません。

template<typename T> void ImageReader<T>::calculate(RGBHistogram<T> &hist)
{
    QImage image;

    if (image.load(QString::fromUtf8(_file.c_str())))
    {
        std::vector<RGBHistogramTrait<T> > *fs = new std::vector<RGBHistogramTrait<T> >[_threads];

        for (ThreadNum i = 0; i < _threads; i++)
        {
            fs->push_back(RGBHistogramTrait<T>(image, hist));
        }

        ThreadCoord::start(image.width() * image.height(), _threads, *fs);

        // Now aggregate the results in fs back into the original hist    


        }
4

1 に答える 1

2

おそらく、RGBHistogram を作成する際に、同じ redHist、greenHist、blueHist を参照渡ししています。また、redHist、greenHist、blueHist はすべて参照メンバーです。もちろん、100 個の RGBHistogram はすべて同じ 3 つのヒストグラムを参照しているため、すべて同じように見えます。

于 2012-09-14T02:03:08.923 に答える