Объявить объект в C ++ без его создания? - PullRequest
1 голос
/ 17 августа 2010

Возможно ли это?Например, если я напишу

Car myCar;

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

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

Ответы [ 6 ]

11 голосов
/ 17 августа 2010

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

Car* car = NULL;

, а затем позже явно вызвать c'or по:

car = new Car( params...);

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

delete car;
7 голосов
/ 17 августа 2010

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

Car* myCar;
6 голосов
/ 17 августа 2010

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

Почему вы хотите это сделать?Возможно, есть какой-то простой способ добиться этого в стиле 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;
  }

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

4 голосов
/ 17 августа 2010

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

Car *MyCar;
MyCar = new Mycar;
1 голос
/ 17 августа 2010

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

Car *myCar;

Позже вы напишите:

myCar = new Car();
0 голосов
/ 25 августа 2010

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

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

В зависимости от области применения существуют другие решения, подобные C / C ++.

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

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

(ключевое слово extern редко используется в C ++).

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

Это может использоваться везде:

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