Дайте мне посмотреть, следую ли я вашим потребностям и сделаю несколько советов по пути ...
Array<String*> v(10);
Похоже, это предназначено для того, чтобы дать вам массив с 10 String*
s, инициализированными в NULL / 0.
Array<Object*> o = v;
Создает массив v.size()
/ 10 Object*
с, каждый из которых скопирован из String*s
in v
.
o[0] = new Integer(1); // technically illegal but no idea how to check
Если это недопустимо, то вы, очевидно, хотите предотвратить перезапись Object*
s, когда это меняет тип времени выполнения ...
- вам нужно перехватить
operator=
для реализации сравнения типов до / после
- для перехвата
operator=
, вам нужно o[0]
для возврата типа, чей operator=
вы можете указать
- разрешение
o[0]
вернуть объект * никогда не будет работать, так как указатели не являются пользовательскими классами: вы не можете изменить поведение operator=
- у вас должно быть o [0], чтобы вернуть прокси-объект - здесь итератор, хотя утверждение семантики и типа присваивания отличается от стандартных контейнерных итераторов
Что приводит нас к:
Array<String*> w = o; // this fails with an exception
Я предполагаю, что это только сбой, потому что ваш o[0] = new Integer()
выше не провалился первым, и что исключением является ваш преднамеренный тест на то, что типы элементов соответствуют ожиданиям: здесь нет проблем, если вы используете прокси-объект, как обсуждалось, для остановки целое число, попадающее в Array<Object*>
.
String* str = v[0]; // should fail horribly as well
Опять же, я предполагаю, что это не получится, потому что ваше раннее назначение Integer
не сработало, и здесь нет новой проблемы.
cout << str << endl;
Итак, прокси-объект кажется ключевым. Дайте мне знать, если вы не знаете, как написать, но я предполагаю, что вы знаете ....