在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();
样式的创建对象?
答案 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)
关于您的问题,实际上有几个方面,取决于您发布的代码段的真正含义。
是的,这个命令可以用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];
}
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;
}
};
在C ++中,可以在某些时候显式实例化类。
但是,C ++没有垃圾收集器为Java或C#等动态对象工作。如果使用new
运算符显式分配内存,则必须在某个时刻delete
分配内存。
另一方面,C ++最近通过提供一组简化内存管理的类来尝试追赶高级语言,例如std::shared_ptr
,std::weak_ptr
或std::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?
您始终可以使用[]来索引数组。如果类支持(重载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;
}