来自java我想在创建新的自定义或其他库的对象时不必处理解除分配。
今天我试图创建一个我的实体对象的实例,如:
entity cube = new entity("entityName")
因为这是实体的构造函数的格式 但我得到以下错误:
cannot convert from |entity *| to |entity|
我注意到如果我只删除new
关键字就没有错误,我想知道两件事。
使用new
时的错误是什么意思? (我对指针的工作原理非常有信心但不完全像我从java开始那样。)
我可以在没有new
关键字的情况下创建这样的对象,或者甚至是创建的对象吗? (因为没有错误。)
答案 0 :(得分:1)
new entity("entityName")
表示“在免费商店中创建entity
的实例并返回指向该实例的指针”
由于指向entity
的指针与entity
不同,因此除非您还有其他构造函数,否则无法使用该值初始化entity
。
做你想做的事的方法是
entity cube("entityname");
你需要一本关于C ++的好书。
答案 1 :(得分:0)
- 使用new时的错误是什么意思? (我对指针的工作原理非常有信心但不完全像我从java开始那样。)
醇>
没有。 C ++与此不同,您不使用分配(新)来初始化cube
:
entity cube("entityName");
- 我可以在没有new关键字的情况下创建这样的对象,或者甚至是创建的对象吗? (因为没有错误。)
醇>
没有。往上看。 (“因为没有错误。”我对此表示怀疑,如果从指针分配entity
,至少应该有编译器警告。)
答案 2 :(得分:0)
首先,我建议你阅读C ++教程。它比Java复杂得多。
这是一个非常部分的Java to C ++"如何转换"我可以给你的指南:
Java代码:
void sayHello(String name) {
system.out.println("Hello, " + name);
}
public static void main(String args[]) {
String name = "James"; // <-- This string is of course created in the dynamic memory
sayHello(name); // <-- "name" will be passed by reference to the "sayHello()" method
}
在C ++中等效 - 选项1 :
void sayHello(const std::string &name) {
std::cout << "Hello, " << name << std::endl;
}
int main() {
std::string name("James"); // <-- Variable is created on the stack
sayHello(name); // <-- Although "name" is not a pointer, it will be passed by reference to "sayHello", as "name" is defiend there with "&", which means that it is a reference
}
参考是一个非常奇怪的&#34; type - 它的行为类似于局部变量,尽管它实际上指向的实例不必位于当前函数的堆栈上或堆栈上。
C ++ - 选项2 :
void sayHello(const std::string *name) {
std::cout << "Hello, " << *name << std::endl; // <-- dereferenceing "name" using a preceding star, as "cout" needs the variable itself and not its address
}
int main() {
std::string *name = new std::string("James"); // <-- Instance is created in the dynamic memory
sayHello(name); // <-- Sending the pointer "name" to the "sayHello" function
// You will need to free "name" somewhere in the code unless you don't care about memory leaks
}
还有更多选项,比如按值传递实例(在这种情况下不推荐),或者在动态内存中创建它并使用deref