Я пытаюсь сделать рефакторинг кода и столкнулся с проблемой. В программе есть менеджер данных, который возвращает указатели на массивы структур как void*. Один из новых типов данных вместо одного указателя на массив структур имеет два указателя на массивы чисел. Проблема в том, что весь код обработки выполняется путем доступа к array[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] и, таким образом, указывает на случайную память.
Можно ли переопределить способ, которым С++ индексирует указатель на объект, или какой-либо другой механизм, который позволит достичь той же цели?