2015-10-25 6 views
4

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

Java:

ArrayList<Object> list; 

C++:

vector<void*> list; 

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

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

+1

void * в C++ определенно не эквивалентен Object в java. Это тип данных, который содержит общий указатель на ячейку памяти. – JJF

+0

Декларация вектора сама по себе должна компилироваться, но вы не указали полный код. Вы, вероятно, делаете то, что не должны с вектором. – aslg

+3

Хороший код редко требует использования 'void *'. Существует почти всегда лучший способ его разработки. Используйте вектор интеллектуальных указателей базового класса. –

ответ

6

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

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

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

3

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

1

Вы правы в обоих точках.

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

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

+0

Спасибо! Просто чтобы вы знали, ваш ответ помог, но Делмер дал мне решение моей проблемы, поэтому я принял его. Спасибо, много! – Addi

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^