Я пытаюсь создать класс, который содержит std::vector
из void*
, Мне сказали, что void*
является ли C ++ эквивалентом Object
на Яве. Поскольку это порт C ++ программы, написанной на Java, она должна работать теоретически.
Джава:
ArrayList<Object> list;
C ++:
vector<void*> list;
Это не скомпилируется, выдав ошибку: «ссылка»: недопустимое использование типа «void» ».
Является void*
на самом деле C ++ эквивалент Java Object
? Я использую это неправильно?
Java Object
является фундаментальным базовым классом, который обеспечивает некоторые общие свойства для всех классов Java.
В C ++ такого нет. Если вы хотите создать полиморфную иерархию, вы создаете свой собственный базовый класс MyBaseClass
(абстрактный или нет), а затем дизайн производных классов.
Таким образом, технически возможно создать vector<void*>
контейнер, но это бессмысленно. Для правильного проектирования программного обеспечения вам нужно создать базовый класс MyBaseClass
, так что вы сможете создать vector<MyBaseClass*>
контейнеры.
Указатель на пустоту означает, что у вас есть адрес памяти чего-либо, но вы не знаете, что это за тип. Вы можете создать свой вектор с указателем любого типа, затем, когда вы добавляете элементы в вектор, вы можете привести свои указатели к любому указателю, который вы использовали в объявлении вектора. Это ненормально, но это будет работать синтаксически. Недостатком является то, что вы не будете знать, какие элементы данных находятся в векторе.
Вы правы в обоих моментах.
void*
НЕ является эквивалентом C ++ Object
,Невозможно дать какой-либо совет о том, что вам следует делать, так как вы не предоставили никакой информации о том, чего вы хотите достичь.
void*
против Object
, Это, конечно, не эквиваленты, void*
переменные содержат адреса к памяти без типа (у нее нет методов, а также они могут указывать на примитивы), Object
переменная является ссылка к объекту, который является экземпляром Object
класс или один из его подклассов (и поэтому имеет некоторые методы, возможность полиморфизма и не может ссылаться на примитивный тип).
Что, вероятно, подразумевается под сравнением, так это то, что если в c ++ вы хотите хранить объекты любой класс вы бы нам void*
и затем бросить по мере необходимости при оценке. Таким образом, они могут делать одни и те же вещи.
Ошибка компиляции, вероятно, вызвана тем, что вы делаете со списком после его создания, так как, как объяснено void*
не может рассматриваться как Object
было бы.