我正在尝试对代码进行一些重构,并遇到了问题。该程序有一个数据管理器,它返回指向结构数组的指针作为void *。其中一种新类型的数据,而不是指向结构数组的单个指针,有两个指向数组的指针。问题是所有处理代码都是通过访问所有记录类型通用的数组[index] .qwTimestamp和array [index] .snSample来完成的。
我认为像下面那样覆盖数组访问运算符([])可能会解决问题:
class ADRec {
public:
ADRec(unsigned __int64* ts, __int32* data, unsigned index = 0): mTimestamps(ts), mDataPoints(data), mIndex(index) {
qwTimeStamp = mTimestamps[mIndex];
snSample = mDataPoints[mIndex];
}
ADRec operator[](unsigned i) {
return ADRec(mTimestamps, mDataPoints, i);
}
unsigned __int64 qwTimeStamp;
__int32 snSample;
private:
unsigned __int64* mTimestamps;
__int32* mDataPoints;
unsigned mIndex;
};
如果您使用对象,此方法可以正常工作:
unsigned __int64 ts[] = { 2, 3, 4, 5};
__int32 data[] = {4, 6, 8, 10};
ADRec tmp = ADRec(ts, data, 0);
ASSERT(tmp[0].qwTimeStamp == 2);
ASSERT(tmp[0].snSample == 4);
ASSERT(tmp[1].qwTimeStamp == 3);
ASSERT(tmp[1].snSample == 6);
但如果使用指向对象的指针则会失败:
unsigned __int64 ts[] = { 2, 3, 4, 5};
__int32 data[] = {4, 6, 8, 10};
ADRec* tmp = new ADRec(ts, data, 0);
ASSERT(tmp[0].qwTimeStamp == 2);
ASSERT(tmp[0].snSample == 4);
ASSERT(tmp[1].qwTimeStamp == 3); //fails
ASSERT(tmp[1].snSample == 6); //fails
C ++在调用tmp [1]时索引指针,因此指向随机存储器。
是否有可能覆盖C ++索引指向对象的指针的方式,或者其他一些可以实现相同目标的机制?
答案 0 :(得分:9)
不,这是不可能的 - 指针被认为是内置类型,因此不能让它们的运算符重载。但是,你当然可以 创建智能指针类(类似于指针但具有附加功能的类)并重载其运算符 - 例如,查看编译器的std :: auto_ptr实现。
答案 1 :(得分:0)
首先尝试取消引用指针:
ADRec* tmp = new ADRec(ts, data, 0);
ASSERT(tmp[0][1].qwTimeStamp == 3);
// or
ASSERT((*tmp)[1].qwTimeStamp == 3);