是否可以覆盖数组访问运算符以获取C ++中对象的指针?

时间:2009-08-27 16:11:10

标签: c++ pointers operators operator-overloading

我正在尝试对代码进行一些重构,并遇到了问题。该程序有一个数据管理器,它返回指向结构数组的指针作为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 ++索引指向对象的指针的方式,或者其他一些可以实现相同目标的机制?

2 个答案:

答案 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);