2010-08-17 2 views
0

Возможно ли это? Например, если я пишуОбъявить объект на C++ без его создания?

Car myCar; 

Затем вызывается конструктор без аргументов автомобиля. Это приводит к ошибке, если есть только конструктор, принимающий аргументы.

В Java я могу легко объявить объект и создать его позже, используя тот же самый оператор, что и выше.

+0

Будет ли заявление, такие как "экстерн автомобиль MyCar;" делать? Позже вы могли бы определить «Автомобиль myCar», например. struct car { машина() {} }; extern car c; автомобиль c; INT основной() { } – Chubsdad

+0

Thx для ур ответы :) – Nils

+0

возможно дубликата [C++: Создание неинициализированного заполнителя переменного, а не объект по умолчанию.] (Http://stackoverflow.com/questions/3291644/c -creating-an-uninitialized-placeholder-variable-rather-than-a-default-object) – Suma

ответ

6

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

Почему вы хотите это сделать? Возможно, есть какой-то чистый способ, как добиться этого в стиле C++.

Если вы хотите создать переменную, которая будет указывать на какой-либо объект позже, это то, что указатели используются для C++.

auto_ptr<Car> car; 

car = new Car(xxx); 

Или «старый путь»:

Car *car = NULL; 

car = new Car(xxx); 

delete car; 

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

std::vector <Car> cars; 
Car *find = NULL; 
for(std::vector<Car>::iterator car = cars.begin(); car != cars.end(); ++car) 
for (int i=0; i<cars.size(); i++) 
    if (Match(*car,xxx) 
    { 
    find=car; 
    break; 
    } 

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

+0

Ну, мне нужно найти объект из вектора объектов, и поэтому мне не нужно постоянно использовать myVector [i], я хотел бы сначала создать ссылку и цикл над списком и прикрепить объект к ссылка, созданная до цикла. – Nils

+0

Итак, вы можете использовать car = & carsVector [i]; –

+2

@Nils Вы, вероятно, захотите использовать векторный итератор вместо индексации в вектор: 'for (std :: vector :: iterator iter = myVector.begin(); iter! = MyVector.end(); ++ iter) ', который позволяет использовать' * iter' для обращения к текущему объекту.В любом случае вы можете сделать ссылку в цикле, которая соответствует текущему элементу, либо 'Car & cur = myVector [i];' или 'Car & cur = * iter;' –

7

Для того, чтобы делать то, что вы делали в Java, вы объявляете указатель в C++:

Car* myCar; 
+0

Да, но тогда я должен создать его на куче. – Nils

+0

Нет, вы этого не делаете. Вы можете позже сделать Car otherCar; myCar = & otherCar; (также, если вы хотите сравнить с java, объекты тоже живут на куче) – nos

+0

@ Нильс, у вас нет другого выбора. Запись на C++ не такая же, как в Java. Если вы хотите, чтобы C'tor не вызывался, вам нужно создать объект в куче. –

11

Ну, вы сбиваете с толку, на Java все является ссылкой (или даже вы можете думать о таких указателях) объектам, а не самим объектам. Таким образом, вы, вероятно, что делать, как это:

Car* car = NULL; 

а затем явно вызывать c'tor по:

car = new Car(params...); 

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

delete car; 
1

Вы можете также использовать указатели, например

Car *myCar; 

Позже вы бы написать:

myCar = new Car(); 
4

Что вы привыкли в Java не объявляя объект и создание позже, но объявив ссылкой и , создавая объект, к которому ссылка ссылается. В C++, что вы ищете это:

Car *MyCar; 
MyCar = new Mycar; 
0

Как обсуждалось выше, буквальный способ представления Java-объектов в C++ является использование указателей на объекты класса.

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

В зависимости от сферы действия существует больше решений на C/C++.

В глобальном или пространстве имен объема, можно использовать EXTERN-спецификатор, чтобы объявить объект, определенный в другом месте:

extern C c; 
<more code> 
c(1,2,3); 

(ехЬегп ключевого слова, как правило, используется редко в пределах C++).

Как обычно, boost предлагает элегантное и общее решение с библиотекой boost::optional.

Это может быть использован everwhere следующим образом:

optional<int> oa; // declaration 
<more code> 
*oa=3; // construction