Использование void * в качестве C ++ эквивалента Java Object

Я пытаюсь создать класс, который содержит std::vector из void*, Мне сказали, что void* является ли C ++ эквивалентом Object на Яве. Поскольку это порт C ++ программы, написанной на Java, она должна работать теоретически.

Джава:

ArrayList<Object> list;

C ++:

vector<void*> list;

Это не скомпилируется, выдав ошибку: «ссылка»: недопустимое использование типа «void» ».

Является void* на самом деле C ++ эквивалент Java Object? Я использую это неправильно?

4

Решение

Java Object является фундаментальным базовым классом, который обеспечивает некоторые общие свойства для всех классов Java.

В C ++ такого нет. Если вы хотите создать полиморфную иерархию, вы создаете свой собственный базовый класс MyBaseClass (абстрактный или нет), а затем дизайн производных классов.

Таким образом, технически возможно создать vector<void*> контейнер, но это бессмысленно. Для правильного проектирования программного обеспечения вам нужно создать базовый класс MyBaseClass, так что вы сможете создать vector<MyBaseClass*> контейнеры.

6

Другие решения

Указатель на пустоту означает, что у вас есть адрес памяти чего-либо, но вы не знаете, что это за тип. Вы можете создать свой вектор с указателем любого типа, затем, когда вы добавляете элементы в вектор, вы можете привести свои указатели к любому указателю, который вы использовали в объявлении вектора. Это ненормально, но это будет работать синтаксически. Недостатком является то, что вы не будете знать, какие элементы данных находятся в векторе.

3

Вы правы в обоих моментах.

  1. void* НЕ является эквивалентом C ++ Object,
    В C ++ нет эквивалента.
  2. Вы используете его неправильно — вы разыменовываете элемент в векторе.

Невозможно дать какой-либо совет о том, что вам следует делать, так как вы не предоставили никакой информации о том, чего вы хотите достичь.

1

  1. void* против Object, Это, конечно, не эквиваленты, void* переменные содержат адреса к памяти без типа (у нее нет методов, а также они могут указывать на примитивы), Object переменная является ссылка к объекту, который является экземпляром Object класс или один из его подклассов (и поэтому имеет некоторые методы, возможность полиморфизма и не может ссылаться на примитивный тип).

    Что, вероятно, подразумевается под сравнением, так это то, что если в c ++ вы хотите хранить объекты любой класс вы бы нам void* и затем бросить по мере необходимости при оценке. Таким образом, они могут делать одни и те же вещи.

  2. Ошибка компиляции, вероятно, вызвана тем, что вы делаете со списком после его создания, так как, как объяснено void* не может рассматриваться как Object было бы.

1
По вопросам рекламы [email protected]