gpt4 book ai didi

C++ "="具有私有(private) vector 和迭代器的类的运算符行为

转载 作者:行者123 更新时间:2023-11-28 01:56:51 26 4
gpt4 key购买 nike

我正在尝试制作一个按顺序提供输出的对象,但我不想公开内部实现。我希望其他类只看到方法 hasNextOutput() 和 nextOutput()。这里分别是我的头文件和类文件:

头文件:

#ifndef RADAR_OUTPUT_GENERATOR_H
#define RADAR_OUTPUT_GENERATOR_H

#include<vector>
#include<iterator>
#include "asl/include/net/asl_net_user_data.h"

class RadarOutputGenerator {
private:
int dataCounter;
std::vector<unsigned char *> dataStream;
std::vector<unsigned char *>::iterator dataStreamIterator;
public:
RadarOutputGenerator();
RadarOutputGenerator(char *filename);
RadarOutputGenerator(unsigned int maxDataSize);
~RadarOutputGenerator();

bool hasNextOutput();
void nextOutput(unsigned char *&dataWithHeader);
};

#endif

类的实现

#include "radar_output_generator.h";

RadarOutputGenerator::RadarOutputGenerator() {

}

RadarOutputGenerator::RadarOutputGenerator(unsigned int maxDataSize) {
for (int i = 0; i < 100; i++) {
// create some data

this->dataStream.push_back(data);

cur_step = (cur_step += 10) & 65535;
}

this->dataStreamIterator = (this->dataStream).begin();
}

bool RadarOutputGenerator::hasNextOutput() {
return (this->dataStreamIterator != this->dataStream.end());
}

void RadarOutputGenerator::nextOutput(unsigned char *&dataWithHeader) {
dataWithHeader = *(this->dataStreamIterator++);
}

问题是,当我构造 RadarOutputGenerator 类型的对象时,hasNext() 方法因“迭代器不兼容”错误而失败,例如此代码失败:

RadarOutputGenerator myOutputGenerator = RadarOutputGenerator(47);
radarOutputGenerator.hasNextOutput(); // this line fails

我想我知道问题出在哪里 - 可能是在调用“=”运算符时, vector 数据流被复制,并且在构造函数中初始化的迭代器保留对原始 vector 的引用。如果是这样的话,这种行为有点让我失望,但我想知道如何正确解决这个问题。

最佳答案

解决这个问题的一种方法是重载复制构造函数和复制赋值运算符来做正确的事情,即计算迭代器到旧 vector 的偏移量,并创建一个指向新 vector 的新迭代器。

作为一般规则,只要一个对象有一个内部指针(指的是它自身的一部分),您就需要手动实现复制。

一个更简单但不是普遍适用的解决方案是像 n.m. 那样做。在评论中说并存储索引而不是迭代器。索引与特定 vector 无关。

关于C++ "="具有私有(private) vector 和迭代器的类的运算符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883491/

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