Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 涉及类的变异困难_C++_Pointers_Mutators - Fatal编程技术网

C++ 涉及类的变异困难

C++ 涉及类的变异困难,c++,pointers,mutators,C++,Pointers,Mutators,我有一个类,characterData,以及这种类型的列表: class characterData { private: vector<vector<int> > pixelData; int area; public: void setPix(vector<vector<int> > in) { pixelData = in; are

我有一个类,
characterData
,以及这种类型的列表:

class characterData {
    private:
        vector<vector<int> > pixelData;
        int area;
    public:
        void setPix(vector<vector<int> > in) {
            pixelData = in;
            area = in.size() * in[0].size();
        }
        vector<vector<int> > getPix() {
            return pixelData;
        }
        int getArea() {
            return area;
        }
};

list<characterData> listChars;
我发现以下错误:

error: invalid initialization of non-const reference of type 'std::vector<std::vector<int> >&' from an rvalue of type 'std::vector<std::vector<int> >'
normalize(inList.front().getPix());
-------------------------------^--
我做了一个临时向量并使用它,它不会出错

vector<vector<int> > temp = inList.front().getPix();
normalize(temp);
vector temp=inList.front().getPix();
正常化(温度);

但这并不能实现我想要的,那就是变异
字符数据的
像素数据。为什么我不能直接访问
pixelData
进行突变?

您的
getPix
方法返回一个临时对象

vector<vector<int> > getPix() {
~~~~~~~~~~~~~~~~~~~~
            return pixelData;
        }
向量getPix(){ ~~~~~~~~~~~~~~~~~~~~ 返回像素数据; }

您可能希望通过引用返回它。

您混淆了指针和引用的用法

while (!inList.empty())
{
    normalize(inList.front().getPix());
    inList.pop_front();
}
vector<vector<int> > &getPix() {return pixelData;}    // note the ampersand
在函数
void processHandler(list*inList)
中,
inList
是指针,但函数中的代码将其用作引用

while (!inList.empty())
{
    normalize(inList.front().getPix());
    inList.pop_front();
}
vector<vector<int> > &getPix() {return pixelData;}    // note the ampersand
需要将列表中的
视为指针。因此,将
inList.
替换为
inList->

while (!inList->empty())
{
    normalize(inList->front().getPix());
    inList->pop_front();
}
这将产生第二个问题,因为
characterData::getPix()
按值返回。但是
normalize()
需要一个引用(因此编译器会抱怨类似于将引用传递给临时对象的事情-临时对象包含
getPix()
返回的值,该值将是
像素数据的副本)。相反,要以这种方式使用它,
getPix()
需要返回一个引用

while (!inList.empty())
{
    normalize(inList.front().getPix());
    inList.pop_front();
}
vector<vector<int> > &getPix() {return pixelData;}    // note the ampersand
vector&getPix(){return pixelData;}//注意符号和
这解决了您的问题。更一般地说,您的设计存在致命缺陷-使用
characterData
的成员函数(通过指针或引用)直接访问任何
private
成员是个坏主意,因为它允许任何代码更改该成员。如果您要这样做,您最好将成员
公开
,而不是
私有

您需要为
characterData
提供成员函数,允许调用者请求更改
private
成员函数(例如添加元素)。如果您选择,这些函数可以忽略此类请求。更重要的是,它们允许类及其成员函数共同确保数据始终处于有效状态。如果调用者可以进行任意更改,则这是不可能的