C ++成员无法更新

时间:2012-04-05 21:52:25

标签: c++ iterator nested pgm

对于varisty项目,我的任务是构建一个操作PGM文件的程序。我几个小时以来一直在反对这个问题,我终于决定放弃并寻求帮助。

我的问题围绕着两个类:

  • pgmImage,一个用于存储PGM图像的类(也包含一个嵌套的迭代器类)
  • pixel_traits,一个包含影响单个像素的静态方法的类

这是我的代码:(我试图剥离到导致我出现问题的成员和函数)

pixel_traits.h

class pixel_traits
{
public:
    typedef unsigned char pixel;
    static inline pixel invert(pixel value)
    {
        return 255-value;
    }
};
}

pgmImage.h

class pgmImage
    {

    public:

        typedef unsigned char pixel;
        int width;
        int height; 
        int pixelStart;
        pixel *pixels;

        class iterator{
        public:
            int x;
            int y;
            iterator(pgmImage& img, int xx, int yy);
            pixel& operator*();

        private:
            pgmImage* image;
        };


        static  void pgmImage::invert(pgmImage::iterator &first, pgmImage::iterator &last,
            pgmImage::iterator &result);

        pgmImage::iterator pgmImage::begin(void);
        pgmImage::iterator pgmImage::end(void);

    };
}

pgmImage.cpp

pgmImage::iterator pgmImage::begin(void)
{
    return iterator(*this,0,0);
}

pgmImage::iterator pgmImage::end(void)
{
    return iterator(*this,width,height);
}

void pgmImage::invert(pgmImage::iterator & first, pgmImage::iterator & last, pgmImage::iterator & result)
{
        for (first.x;first.x!=last.x;first.x++){
            for (first.y;first.y!=last.y;first.y++){

                *result=pixel_traits::invert(*first);

                result.y++;
            }
            result.x++;
        }
}

iterator.cpp

pgmImage::iterator::iterator(pgmImage& img, int xx, int yy)
{   
    x=xx;
    y=yy;
    image=&img;
}

pgmImage::pixel& pgmImage::iterator::operator*()
{
    return (*image).pixels[(*image).pixelStart+(y*(*image).width)+x];
}

现在我的问题是调用我的反转方法不会改变PGM的像素。

示例:

cout<<img(10,10)<<"\n";
pgmImage::invert(img.begin(),img.end(),img.begin());
cout<<img(10,10)<<"\n";

两个打印件都将返回相同的值,而第二个为255减去第一个值。

现在让我疯狂的是,当我调试它时,反转功能似乎正在工作。如果我在反转方法中添加一些打印件。即

cout<<*result<<"\n";
*result=pixel_traits::invert(*first);
cout<<*result<<"\n";

然后我会第二次打印出反转值。但由于某种原因,这种变化并没有反映出实际的pgmImage对象。

编辑:问题已解决!

原来我没有在invert方法中重置其中一个迭代器位置。解决方案:

void pgmImage::invert(pgmImage::iterator & first, pgmImage::iterator & last,
pgmImage::iterator & result){


    for (first.x;first.x!=last.x;first.x++){
        for (first.y;first.y!=last.y;first.y++){

            *result=pixel_traits::invert(*first);

        result.y++;

        }

        result.y=0;
        first.y=0;
        result.x++;
    }
}

谢谢大家!

0 个答案:

没有答案