1

这可能吗?例如,如果我写

Car myCar;

然后调用不带 Car 参数的构造函数。如果只有构造函数接受参数,则会导致错误。

在 Java 中,我可以轻松地声明一个对象,并在以后使用与上面完全相同的语句创建它。

4

6 回答 6

11

好吧,您感到困惑,在Java中,一切都是对象的引用(甚至您可以认为是指针),而不是对象本身。所以你可能会这样做:

Car* car = NULL;

然后通过以下方式显式调用 c'tor:

car = new Car( params...);

并且不要忘记delete在你使用完汽车对象后打电话。

delete car;
于 2010-08-17T07:34:45.050 回答
7

要执行您在 Java 中所做的事情,您需要在 C++ 中声明一个指针:

Car* myCar;
于 2010-08-17T07:34:23.803 回答
7

不,这是不可能的。您可以根据新位置提出一些肮脏的技巧,这可能会让您接近,但我怀疑您对它们感兴趣。

你为什么要这样做?也许有一些干净的方法可以以 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;
  }

在许多情况下,您可能也不希望有汽车向量,但也有指向汽车的指针。

于 2010-08-17T07:34:25.637 回答
4

您在 java 中习惯的不是声明对象并稍后创建它,而是声明引用创建引用稍后引用的对象。在 C++ 中,您正在寻找的是:

Car *MyCar;
MyCar = new Mycar;
于 2010-08-17T07:37:20.957 回答
1

您也可以使用指针,例如

Car *myCar;

稍后你会写:

myCar = new Car();
于 2010-08-17T07:35:10.073 回答
0

如前所述,在 C++ 中表示 java 对象的文字方式是使用指向类对象的指针。

在 new 语句中使用 C++ 指针有一个缺点,即必须访问较慢的堆,并且必须手动删除对象。

根据范围,有更多类似 C/C++ 的解决方案。

在全局或命名空间范围内,您可以使用 extern-specifier 声明一个对象,在别处定义:

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

(extern 关键字在 C++ 中很少使用)。

像往常一样,boost 通过库boost::optional提供了一个优雅而通用的解决方案。

这可以在任何地方使用,如下所示:

optional<int> oa; // declaration
<more code> 
*oa=3; // construction
于 2010-08-25T07:41:06.577 回答