Инициализировать структуру в конструкторе класса - PullRequest
2 голосов
/ 22 сентября 2011

Как мы можем инициализировать указатель структуры в конструкторе класса.Пример:

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 ]

14 голосов
/ 22 сентября 2011

Я удивлен, что никто не предложил следующее ...

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, это автоматически ...

3 голосов
/ 22 сентября 2011

Когда вы создаете экземпляр my_class, указатель s1 ни на что не указывает.Вы должны выделить для него память следующим образом:

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

Вам также потребуется создать для него деструктор:

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

Кроме того, поскольку это C ++, я рекомендую вам использоватьstd::string вместо char* с.

2 голосов
/ 22 сентября 2011

Поскольку это 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, если вы выберете char* и strdup).

0 голосов
/ 22 сентября 2011

Если структура находится внутри класса, вы можете использовать конструктор структуры:

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";
  }
};
0 голосов
/ 22 сентября 2011

Я почти уверен, что вы можете использовать список инициализации и 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чаще всего будет лучше.

0 голосов
/ 22 сентября 2011
 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...