我有一个班级
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)。我以为我已经通过_hist(hist)在RGBHistogramTrait的构造函数中浅层复制了RGBHistogram。 RGBHistogram有一个std :: map,没有定义的复制consturctor。
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
}
答案 0 :(得分:2)
嗯,您可能在创建RGBHistogram时通过引用传递相同的redHist,greenHist,blueHist。而redHist,greenHist,blueHist都是参考成员。当然,所有100个RGBHistogram似乎都是相同的,因为它们都引用相同的3个直方图。