У меня есть приложение на C ++ с пользовательским классом ArrayBase
, который управляет хранением и доступом к непрерывно выделенной области памяти.У меня есть отдельный класс ItrBase
, который используется для доступа к данным в этом ArrayBase
.ArrayBase
имеет функцию createItr()
, которая в настоящее время возвращает объект ItrBase
.
Мне нужно расширить ArrayBase
, чтобы использовать несколько выделений памяти вместо одного смежного.Я создал EnhancedArray
класс для этого.Чтобы этот EnhancedArray
был совместим с существующим приложением, его функция createItr()
должна возвращать что-то, что работает с новыми множественными выделениями памяти.
Итак, я создал производный класс EnhanceItr
для этого,Моя проблема в том, что я не могу найти способ для сотен вхождений кода, подобных этому:
ItrBase anIterator = anArray.createItr();
...
double x = anIterator.getData();
, чтобы использовать функцию EhancedItr
getData()
, когда anArray
является EnhancedArray
.
Вот простое приложение, иллюстрирующее мое основное расположение.
#include <iostream>
using namespace std;
class ItrBase {
public:
ItrBase() { cout << "ItrBase constructor.\n"; };
~ItrBase() { cout << "ItrBase destructor.\n"; };
virtual int vfunc() {return 1;};
};
class EnhancedItr : public ItrBase {
public:
EnhancedItr() { cout << "EnhancedItr constructor.\n"; };
~EnhancedItr() { cout << "EnhancedItr destructor.\n"; };
int vfunc() {return 0;};
};
class ArrayBase {
public:
ArrayBase() { cout << "ArrayBase constructor.\n"; };
~ArrayBase() { cout << "ArrayBase destructor.\n"; };
virtual ItrBase & createItr() {cout << "in AB's createItr()\n"; return *new ItrBase(); };
};
class EnhancedArray : public ArrayBase {
public:
EnhancedArray() { cout << "EnhancedArray constructor.\n"; };
~EnhancedArray() { cout << "EnhancedArray destructor.\n"; };
EnhancedItr & createItr() {cout << "in EA's createItr()\n"; return *new EnhancedItr(); };
};
int main()
{
ArrayBase ab;
EnhancedArray ea;
ItrBase itr = ab.createItr();
ItrBase eitr = ea.createItr(); //EnhancedItr assigned to ItrBase
cout << "ArrayBase's Itr .vfunc(): " << itr.vfunc() <<std::endl;
cout << "EnhancedArray's Itr .vfunc(): " << eitr.vfunc() <<std::endl;
return 0;
}
Оба вызова на vfunc()
выше возвращают 1, когда я хочу, чтобы второй вызов возвратил 0.
В main()
я знаю, что если я изменю типы ItrBase
на ItrBase &
, я получу требуемые типы возврата, но затем я изменяю свой «существующий» код в сотнях областей и деструкторыИтераторы не называются.
Есть ли другая стратегия, которую я не вижу?
Спасибо.