使用“new”运算符在数组C ++中创建对象

时间:2014-05-28 14:11:10

标签: c++ arrays object new-operator

在Java中

nodes[i] = new Object();

是有效的陈述

什么是C ++等价物?

编辑:

似乎我没有提供足够的背景信息。

我正在阅读一些实现QuadTree的Java代码,我很好奇如何用C ++重写那段代码。

我不需要直接等价物,我想要的东西本质上意味着相同的东西。

在Java中,您可以执行

之类的操作
class A
{
public A (someObject o);
}

主要方法:

A aObject = new A(new someObject());

或循环:

for(int i = 0; i < arr.length; i++)
{
arr[i] = new someObject();
}

在C ++中,我知道你可以这样做:

std::vector<someObject*> arr;
someObject* o = new someObject;
arr.push_back(o);

在C ++中没有显式声明的情况下是否有类似于java new Object();样式的创建对象?

2 个答案:

答案 0 :(得分:4)

Java是一种垃圾收集语言,而C++则不是。这些语言在上面的代码“意味着什么”上有很大不同,引用直接的“等价物”并不是一件容易的事。

在C ++中实现它的类似方法是使用shared_ptr,它不是垃圾收集的,而是确保当对它们的所有引用都超出范围时底层对象被销毁。

#include <vector>
#include <memory>
using namespace std;


class Object
{
};

int main()
{
    std::vector<std::shared_ptr<Object>> nodes(1);

    nodes[0] = std::make_shared<Object>();

    return 0;
}

答案 1 :(得分:1)

关于您的问题,实际上有几个方面,取决于您发布的代码段的真正含义。

1。显式命令

是的,这个命令可以用C ++发布,例如:

class Object
{

};

int main(int argc, char * argv[])
{
    std::vector<Object *> nodes;
    nodes.push_back(nullptr);
    int i = 0;

    nodes[i] = new Object();

    // To prevent memory leaks
    delete nodes[i];
}

2。使用通用基类Object

C ++没有通用基类,例如Java或C#中的Object。你必须实例化某些东西把它放到数组或std :: vector中。 (了解更多:Root base class in C++

如果你的代码中确实需要这样的类,你可以简单地定义一个,例如:

class Object
{
    virtual std::string ToString()
    {
        return "Object";
    }

    virtual int GetHashCode()
    {
        return (int)this;
    }

    virtual bool Equals(Object & other)
    {
        return this == &other;
    }
};

3。内存管理

在C ++中,可以在某些时候显式实例化类。

但是,C ++没有垃圾收集器为Java或C#等动态对象工作。如果使用new运算符显式分配内存,则必须在某个时刻delete分配内存。

另一方面,C ++最近通过提供一组简化内存管理的类来尝试追赶高级语言,例如std::shared_ptrstd::weak_ptrstd::unique_ptr,例如:

class Object
{

};

int main(int argc, char * argv[])
{
    std::vector<std::unique_ptr<Object>> nodes;
    nodes.resize(1);
    int i = 0;

    nodes[i] = std::unique_ptr<Object>(new Object());

    // nodes destructor will call std::unique_ptr<Object>
    // destructor, which will eventually destroy instance
    // of the Object class.
}

在此处阅读更多内容:What is a smart pointer and when should I use one?

4。索引数组,类

您始终可以使用[]来索引数组。如果类支持(重载std::vector运算符),可以使用[]来索引类实例(例如[])。

int main(int argc, char * argv[])
{
    // Statically allocated array
    int test[5];
    test[0] = 1;

    // Dynamically allocated array
    // This is useful if you work with
    // some C libraries or simply (really)
    // need to allocate a block of memory.
    int * test2 = new int[5];
    test2[0] = 1;
    delete[test2];

    // This is a lot more C++ way of keeping
    // an array of items:
    std::vector<int> test3;
    test3.resize(1);
    test3[0] = 1;
}