在类构造函数中初始化struct

时间:2011-09-22 07:15:45

标签: c++ constructor struct

如何在类的构造函数中初始化结构指针。 示例:

struct my_struct{
    int i; 
    char* name;
}; 
class my_class{ 
    my_struct* s1;
    my_class() {
        // here i want to make s1->i = 10; and s1->name = "anyname" ;  
        // should i assign it like s1->i= 10; and call new for s1->name and strcpy(s1->name "anyname");  
        // it compiles in g++ without any warning/error but gives seg fault at run time  
    }
};

6 个答案:

答案 0 :(得分:14)

我很惊讶没有人提出以下建议......

struct my_struct
{
  int i; 
  std::string name;

  my_struct(int argI, std::string const& argName) : i(argI), name(argName) {}
};

class my_class
{
  my_struct s1;  // no need for pointers!

  my_class() : s1(1, std::string("test name")) {} // construct s1 using the two argument constructor, can also default construct as well.
};

使用这种方法,您无需担心清理s1,它是自动的......

答案 1 :(得分:3)

当您创建my_class的实例时,s1指针不指向任何内容。你必须像这样分配内存:

myclass() {
    s1 = new my_struct;
    // initialize variables
}

您还必须为它创建一个析构函数:

~myclass() {
    // delete variables
    delete s1;
}

此外,由于这是C ++,我建议您使用std::string代替char*

答案 2 :(得分:2)

由于这是C ++,请使用std::string代替char*

struct my_struct{
    int i; 
    std::string name;
}; 
class my_class{ 
    my_struct* s1;
    my_class() {
        s1 = new my_struct;
        s1->i = 10;
        s1->name = "anyname";
    }
};

原始代码发生错误的原因是您未能为s1分配内存,也无法为s1->name分配内存。我已经使用new修复了前者,使用std::string修复了后者。如果由于某种原因您无法使用std::string,请在尝试使用strdup的地方使用strcpy

最后,请不要忘记提供my_class的析构函数,以便删除s1(如果您选择s1->name并{{1},则会释放char* }})。

答案 3 :(得分:0)

我很确定你可以使用初始化列表,并且直接使用new + init结构。此外,您不能忘记在完成后必须删除指针:

struct my_struct{
    int i; 
    char* name;
}; 
class my_class{ 
    my_struct* s1;
    my_class() : s1(new my_struct) {
        s1->i = 2;
        s1->name = "Something";
    }
    ~my_class() { delete s1; }
};

此外,请确保您使用char*是有原因的,否则std::string通常会更好。

答案 4 :(得分:0)

如果结构在类中,则可以使用结构构造函数:

struct my_struct
{
  int i; 
  std::string name;

  my_struct()
  {
    i = 10;
    name = "anyname";
  };
};

如果是全局的,首先需要创建对象然后初始化它:

class my_class
{ 
  my_struct * s1;
  my_class() : s1(new my_struct())
  {
    s1->i = 10;
    s1->name = "anyname";
  }
};

答案 5 :(得分:-3)

 my_class() {
     s1 = new (my_struct);
     s1->i = 10;
     s1->name = (char *) malloc(strlen("anyname"));
     s1->name = "anyname";
     // here i want to make s1->i = 10; and s1->name = "anyname" ;  
     // should i assign it like s1->i= 10; and call new for s1->name and strcpy(s1->name "anyname");  
     // it compiles in g++ without any warning/error but gives seg fault at run time  
  }


 ~my_class(){
     free(s1->name);
     delete s1;
  }