gpt4 book ai didi

c++ - 涉及类的突变困难

转载 作者:行者123 更新时间:2023-11-30 03:33:35 25 4
gpt4 key购买 nike

我有一个类 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;

我正在尝试用其他方法改变 pixelData,但一直遇到问题。我有一个方法可以对 pixelData 执行某些功能:

void processHandler(list<characterData> &inList) {
while (!inList.empty()) {
normalize(inList.front().getPix());
inList.pop_front();
}
}

void normalize(vector<vector<int> > &input) {
if (input.size() > input[0].size()) {
affixRows(input, input.size() - input[0].size());
} else if (input.size() > input[0].size()) {
affixCols(input, input[0].size() - input.size());
}
}

void affixRows(vector<vector<int>> &input, int dimDiff) {
vector<vector<int>> temp(input.size(), vector<int>(input[0].size() + dimDiff));
for (unsigned int i = 0; i < temp[0].size(); i++) {
for (unsigned int j = 0; j < temp.size(); j++) {
if (i < (unsigned int)dimDiff / 2) {
temp[j][i] = 255;
}
else if (i < input[0].size() + (int)dimDiff / 2) {
temp[j][i] = input[j][i - (int)dimDiff / 2];
}
else {
temp[j][i] = 255;
}
}
}
input = temp; // point of mutation
}

void affixCols(vector<vector<int>> &input, int dimDiff) {
vector<vector<int>> temp(input.size() + dimDiff, vector<int>(input[0].size()));
for (unsigned int i = 0; i < temp[0].size(); i++) {
for (unsigned int j = 0; j < temp.size(); j++) {
if (j < (unsigned int)dimDiff / 2) {
temp[j][i] = 255;
}
else if (j < input.size() + (int)dimDiff / 2) {
temp[j][i] = input[j - (int)dimDiff / 2][i];
}
else {
temp[j][i] = 255;
}
}
}
input = temp; // point of mutation
}

我收到这些错误:

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());
-------------------------------^--

如果不是:

normalize(inList.front().getPix());

我制作了一个临时 vector 并使用它,它没有错误。

vector<vector<int> > temp = inList.front().getPix();
normalize(temp);

但这不会完成我想要的,即改变 characterDatapixelData。为什么我不能直接访问 pixelData 以进行变异?

最佳答案

您混淆了指针和引用的使用。

在函数中 void processHandler(list<characterData> *inList) , inList是指针,但函数内的代码将其用作引用。

while (!inList.empty())
{
normalize(inList.front().getPix());
inList.pop_front();
}

需要治疗inList作为指针。所以替换 inList.inList-> .

while (!inList->empty())
{
normalize(inList->front().getPix());
inList->pop_front();
}

这将给出第二个问题 characterData::getPix()按值(value)返回。但是normalize()需要引用(因此编译器会提示类似于将引用传递给临时对象的情况 - 临时对象保存 getPix() 返回的值,这将是 pixelData 的拷贝)。相反,以这种方式使用它,getPix()需要返回一个引用。

vector<vector<int> > &getPix() {return pixelData;}    // note the ampersand

这解决了您的问题。更一般地说,您的设计存在致命缺陷 - characterData 的成员函数提供对任何 private 的直接访问(通过指针或引用) member 是个坏主意,因为它允许任何代码更改该成员。如果你打算这样做,你不妨让成员public而不是 private .

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

关于c++ - 涉及类的突变困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42743773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com