如何在类的构造函数中初始化结构指针。 示例:
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
}
};
答案 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;
}