【问题标题】:Using "new" operator to create objects in an array C++使用“new”运算符在数组 C++ 中创建对象
【发布时间】:2014-05-28 14:11:09
【问题描述】:

在 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);

是否有类似于 java 的 new Object(); 在 C++ 中无需显式声明即可创建对象的风格?

【问题讨论】:

  • 没有直接的等价物。这取决于您要在 nodes 中存储的内容。
  • 正确学习 C++,不要使用 Java 作为编写 C++ 代码的指南。寻找“等价物”只会导致编写糟糕的 C++ 代码。
  • @PaulMcKenzie ...除非这是将代码从 Java 转换为 C++ 的问题。不知道上下文很难说。
  • @Spook 从一种语言“翻译”到另一种语言是没有意义的。尤其是在没有直接翻译的情况下。
  • @juanchopanza 是吗?互联网上有很多 Java 示例算法实现,我不得不将它们翻译成 C++。如果你真的真的需要直接翻译,IMO,只需实现一个基础Object类,你'很好去。

标签: c++ arrays object new-operator


【解决方案1】:

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;
}

【讨论】:

    【解决方案2】:

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

    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。您必须实例化 something 以将其放入数组或 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2013-02-12
      相关资源
      最近更新 更多