Структура, имеющая указатель на член в C ++, как получить к нему доступ - PullRequest
0 голосов
/ 25 января 2019

ОК, вот мой код. У меня есть структура с именем employee, и у нее есть имя члена char *. Как мне изменить значение имени?

struct employee {
    char* name;
    int age;
};

int main()
{
    struct employee james;
    james.age=12; // this line is fine 
    james.name = "james"; // this line is not working
    cout << james.name;
    return 0;
}

Ответы [ 4 ]

0 голосов
/ 25 января 2019

Если вы заинтересованы в использовании char *, вы можете сделать что-то вроде этого:

#include <iostream>
#include <string.h>
#include <stdlib.h>

struct employee {
    char *name;
    int age;
};

int main() {
    employee james;
    james.age=12;
    james.name = (char *)malloc(sizeof(char) * 10);
    strcpy(james.name, "James");
    std::cout << james.name << std::endl;

    return 0;
}

Или вы можете использовать std :: string в своей структуре следующим образом:

#include <iostream>
#include <string>

struct employee {
    std::string name; 
    int age;  
};

int main() {
    employee james;
    james.age=12; 
    james.name = "james";

    std::cout << james.name; 

    return 0;
}
0 голосов
/ 25 января 2019

Используйте std :: string вместо указателя char *, он будет работать нормально

#include <iostream>
#include <string>

struct employee {
     std::string name; 
     int age; 
}; 
int main() { 
     employee james;
     james.age=12; 
    james.name = "james";

    std::cout << james.name; 

    return 0; 
}

Или Если вы хотите использовать указатель char *, используйте const char* name, он будет работать.

#include <iostream>
struct employee { 
     const char* name;
     int age;
 };

int main() {
     employee james; 
     james.age=12;
     james.name = "james"; 
     std::cout << james.name; 

return 0; 
}
0 голосов
/ 25 января 2019

Любое литеральное строковое значение, которое вы вводите в свой исходный код (например, "james"), по определению является значением const char*, const означает, что оно не может быть изменено во время выполнения программы. В вашем классе член name объявлен как тип char*, который не является const, и поэтому может быть изменен во время выполнения. Ваш компилятор не позволяет вам присваивать значение const char* переменной типа char* для сохранения инварианта о том, что значение типа const char* не может быть изменено. (Конечно, все в порядке; вы можете присвоить значение char* переменной типа const char*.

Чтобы исправить это с наименьшим количеством символов, вы должны изменить char* name на const char* name в вашем определении структуры employee. Тем не менее, я согласен с тем, что лучше всего поменять его на std::string члена, как @ Hamza.S изложил в своем ответе. Класс std::string имеет оператор присваивания, который строит его из значения const char*, поэтому строка james.name = "james" в своем ответе по существу устанавливает std::string равным const char* значению "james".

0 голосов
/ 25 января 2019

Вы можете попробовать использовать strcpy

strcpy(james.name, "james");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...