试图使用我的自定义类构造函数没有新的

时间:2015-04-05 16:37:02

标签: c++

来自java我想在创建新的自定义或其他库的对象时不必处理解除分配。

今天我试图创建一个我的实体对象的实例,如:

entity cube = new entity("entityName")

因为这是实体的构造函数的格式 但我得到以下错误:

cannot convert from |entity *| to |entity|

我注意到如果我只删除new关键字就没有错误,我想知道两件事。

  1. 使用new时的错误是什么意思? (我对指针的工作原理非常有信心但不完全像我从java开始那样。)

  2. 我可以在没有new关键字的情况下创建这样的对象,或者甚至是创建的对象吗? (因为没有错误。)

3 个答案:

答案 0 :(得分:1)

new entity("entityName")

表示“在免费商店中创建entity的实例并返回指向该实例的指针” 由于指向entity的指针与entity不同,因此除非您还有其他构造函数,否则无法使用该值初始化entity

做你想做的事的方法是

entity cube("entityname");

你需要一本关于C ++的好书。

答案 1 :(得分:0)

  
      
  1. 使用new时的错误是什么意思? (我对指针的工作原理非常有信心但不完全像我从java开始那样。)
  2.   

没有。 C ++与此不同,您不使用分配(新)来初始化cube

entity cube("entityName");
  
      
  1. 我可以在没有new关键字的情况下创建这样的对象,或者甚至是创建的对象吗? (因为没有错误。)
  2.   

没有。往上看。 (“因为没有错误。”我对此表示怀疑,如果从指针分配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