Создание объекта на C ++

Не

 A a = new A();   // A is a class name

должен работать на C ++?

Я осознаю:

требуется преобразование из 'A *' в нескалярный тип 'A'

Что не так с этой строкой кода?


Это работает на Java, верно?

Кроме того, как же тогда правильно создать новый объект типа A в C ++?


person Moeb    schedule 15.04.2010    source источник
comment
Пожалуйста! Прочтите книгу о C ++! Прочтите об автоматическом и динамическом распределении. Кстати, в С ++ НЕТ сборки мусора ...   -  person ALOToverflow    schedule 15.04.2010


Ответы (6)


Нет, это не так. Новая операция возвращает указатель на вновь созданный объект, поэтому вам необходимо:

A * a = new A();

Вам также нужно будет управлять удалением объекта где-нибудь еще в вашем коде:

delete a;

Однако, в отличие от Java, обычно нет необходимости динамически создавать объекты в C ++, и по возможности вам следует избегать этого. Вместо приведенного выше вы можете просто сказать:

A a;

а компилятор будет управлять временем жизни объекта за вас.

Это очень простые вещи. Какой учебник C ++ вы используете, который не охватывает его?

person Community    schedule 15.04.2010
comment
@ Нил Баттерворт: Я был так уверен, что писал его правильно. Я думаю, это потому, что в Java это делается именно так. - person Moeb; 15.04.2010
comment
@cambr Java и C ++ почти не имеют ничего общего, кроме тривиального синтаксического сходства. Ваш опыт Java не очень пригодится при изучении C ++, поэтому вам нужно прочитать хорошую книгу - см. stackoverflow.com/questions/388242/ - person ; 15.04.2010
comment
@cambr: В Java есть абстракции, с которыми C ++ просто не может уйти, хорошо это или плохо. Почти все переменные Java на самом деле являются указателями с точки зрения C или C ++, поэтому их не нужно указывать. C и C ++ имеют как объекты динамических данных, на которые ссылаются указатели, так и локальные объекты, на которые не ссылаются указатели. Переход от Java к C ++ потребует изучения некоторых новых концепций. - person David Thornley; 15.04.2010

new A() возвращает указатель A*. Ты можешь написать

A a = A();

который создает временный экземпляр с конструктором по умолчанию, а затем вызывает конструктор копирования для a или даже лучше:

A a;

который просто создает с конструктором по умолчанию. Или, если вам нужен указатель, вы можете написать

A* a = new A();

что дает вам больше гибкости, но больше ответственности.

person clahey    schedule 15.04.2010
comment
A() создает временный объект с инициализацией значения, не обязательно с конструктором по умолчанию. - person AnT; 15.04.2010

Ключевое слово new используется, когда вы хотите создать указатель на объект:

A* a = new A();

Он выделяется в кучу ... а когда у вас нет указателя, а просто реальный объект, вы просто используете

A a;

Это объявляет объект и создает его в стеке (так что он будет жив только внутри вызова)

person Jack    schedule 15.04.2010

Вам нужно A* a= new A();

new A(); создает и конструирует объект типа A и помещает его в кучу. Он возвращает указатель этого типа.

Другими словами, new возвращает адрес того места, где объект был помещен в кучу, а A* - это тип, который содержит адрес для объекта типа A.

Каждый раз, когда вы используете кучу с new, вам нужно вызывать связанный delete по адресу.

person Brian R. Bondy    schedule 15.04.2010

new дает вам указатель на созданный объект, поэтому:

A *a = new A();
person Matti Virkkunen    schedule 15.04.2010

Во-первых, new возвращает указатель, поэтому вам нужно объявить тип a как «A *». Во-вторых, в отличие от Java, скобки после A не нужны:

A * a = новый A;

person Alex Jenter    schedule 15.04.2010