代码之家  ›  专栏  ›  技术社区  ›  Nils

在C++ W/O中声明一个对象来创建它?

  •  1
  • Nils  · 技术社区  · 14 年前

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

    Car myCar;
    

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

    在Java中,我可以很容易地声明一个对象,然后使用与上面相同的语句来创建它。

    6 回复  |  直到 14 年前
        1
  •  6
  •   Suma    14 年前

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

    你为什么要这样做?也许有一些干净的方式如何实现这在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;
      }
    

    在许多情况下,你可能也不喜欢有一个汽车向量,而是有指向汽车的指针。

        2
  •  11
  •   Suma    14 年前

    好吧,你困惑了,在Java中,每件事物都是对对象的引用(或者你可以想到类似的指针),而不是对象本身。 所以你可能会这样做:

    Car* car = NULL;
    

    然后通过以下方式明确地调用构造函数:

    car = new Car( params...);
    

    别忘了打电话 delete 在你使用完汽车物品之后。

    delete car;
    
        3
  •  7
  •   stefaanv    14 年前

    要执行Java中的操作,请在C++中声明指针:

    Car* myCar;
    
        4
  •  4
  •   Sniggerfardimungus    14 年前

    您在Java中所使用的不是声明对象并在以后创建它,而是声明 参考 创建引用引用的对象 后来。在C++中,你要寻找的是:

    Car *MyCar;
    MyCar = new Mycar;
    
        5
  •  1
  •   Mononofu    14 年前

    你也可以用指针。

    Car *myCar;
    

    以后你会写:

    myCar = new Car();
    
        6
  •  0
  •   mirk    14 年前

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

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

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

    在全局或命名空间范围内,可以使用外部说明符声明在其他地方定义的对象:

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

    (Extn关键字通常在C++中很少使用)。

    和往常一样,Boost为图书馆提供了一个优雅而通用的解决方案。 boost::optional .

    可在以下任何地方使用:

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