2011-01-17 2 views
5

Я знаю, что это может звучать как глупый вопрос, но почему я получаю ошибку, которая говорит что-то вроде «Что случилось с «новым» ключевым словом в C++?

не может преобразовать объект * в объект

», когда я пытаюсь создать экземпляр новый Объект с использованием заявления «

Object obj = new Object(); 

«?

Я понял, что ключевое слово «новое» зарезервировано для указателей? Или что-то еще?

+10

От «нового» ничего нет. Только с вашим пониманием. – delnan

+8

Ничего нехорошо. C++ имеет только разную семантику, и вы должны забыть, что, как вы предполагали, знали. Понимание C++ требует понимания того, где хранятся объекты (куча или стек). Тогда вы понимаете, почему 'new' обязательно возвращает указатель. – Benoit

+4

C++ не является ни Java, ни C#; есть различия, и вы их определили. – andand

ответ

38
Object* obj = new Object(); 

new всегда возвращает указатель на объект.

если вы пишете только Object obj, это значит, что obj будет держать объект сам. Если он объявлен таким образом внутри функции, тогда память будет выделена в стеке и будет вытерта после того, как вы покинете эту функцию. new выделяет память на кучу, поэтому указатель может быть возвращен из функции. Обратите внимание, что указатель также может указывать и на локальную (стек) переменную.

+1

был бы рад услышать причину, лежащую в основе downvote – Andrey

+0

@ Andnd. Вам повезло. [Сегодня здесь скучают люди] (http://stackoverflow.com/questions/4716629/c-error-returning-a-char-array/4716656#4716656). У вас только один нисходящий. ;-) –

+1

@Andrey: Не было меня, но если бы это было, я бы предположил, что это «Object * ob ...» vs «Object * ob ...» обозначение Я признаю, что думал об этом ... ;) – FrustratedWithFormsDesigner

6

Точно. Новый создает объект в куче, а возвращает указатель на него.

8

С new возвращает указатель, вы должны использовать

Object *obj = new Object(); 
+2

+1 для 'Object * obj' over' Object * obj'. – FrustratedWithFormsDesigner

+1

Я предпочитаю Object * obj сам. – ThomasMcLeod

+5

@Thomas: Как насчет 'Object * obj'? ;-) – fredoverflow

6

новый оператор делает указатель на объект

там Object *obj = new Object() должен работать.

, но только объект OBJ() создает объект просто отлично, но в стеке

+0

'Object obj()' может быть глобальной переменной и не будет в стеке – Andrey

+6

'Object obj();' объявляет функцию с именем 'obj', которая не принимает параметров и возвращает' Object'. – fredoverflow

6

объект OBJ;

- это все, что вам нужно. Он создает объект obj.

+2

Возможно, это то, что ему нужно; но мы не можем считать это само собой разумеющимся. – Benoit

1

Я бы просто оставил комментарий, но, видимо, мне нужен определенный представитель, чтобы сделать это.

В Java переменные, используемые для хранения объектов, неявно указывают на объект. Итак, new работает аналогично в C++, как Java, но вы не узнаете об этом на Java. Я собираюсь догадаться, что это причина вашего замешательства.

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