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。我想创建 100 个 RGBHistogramTrait 实例,每个 RGBHistogramTrait 实例都应该创建 RGBHistogram 的副本,每个实例都将由一个线程使用。

我会将 100 个线程的结果聚合回原始的 RGBHistogram。问题是 RGBHistogramTrait 的每个实例中的 _hist 以某种方式指向同一事物(原始 RGBHistogram)。我以为我已经在 _hist(hist) 的 RGBHistogramTrait 的构造函数中浅复制了 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 回答