Метод для изменения элементов внутри структуры в C ++? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть структура с 2 полями, которые имеют значение.Я хотел бы реализовать метод, который изменяет значения полей.Я сделал это с помощью следующего кода, но это не правильно.Я хотел бы спросить, как я могу это исправить?

#include <iostream>
using namespace std;
struct CPerson {
    const char* name = "Ivan";
    const char* gender = "Male";

};
void SetName(const char* szName) {
    //what to write here?
    *name = *szname;
}

Ответы [ 4 ]

0 голосов
/ 09 декабря 2018

Структура работает как класс, с той лишь разницей, что по умолчанию все внутри структуры общедоступны.

Таким образом, вы можете (и в этом случае вы должны) объявить setName внутри структуры

0 голосов
/ 19 сентября 2018

вам нужно сделать его функцией-членом

#include <iostream>
using namespace std;
struct CPerson {
    const char* name = "Ivan";
    const char* gender = "Male";


   void SetName(const char* szName) {
    //what to write here?
    name = szname;
}
};

этот код по-прежнему неверен, поскольку он просто манипулирует указателями.Вы должны использовать std :: string для хранения строк.Но по крайней мере код скомпилируется;

0 голосов
/ 09 декабря 2018

Я хотел бы реализовать метод, который изменяет значения полей.

Я не был бы настолько уверен, что вы должны это сделать.

Вы видитеполя структуры по умолчанию общедоступны - это означает, что любой может изменить их, метод или метод.Зачем писать такой метод?Разве это не избыточно?

Если у вас был класс вместо структуры, или если вы установили свой доступ к полю на protected или private, то имеет смыслесть метод для установки значения поля, например:

#include <string>
#include <string_view>

struct Person {
protected:
    std::string name = "Ivan";
    std::string gender = "Male";

public:
   void changeName(std::string_view new_name) {
       name = new_name;
   }
};

(string_view является новым в C ++ 17; до этого вы могли использовать const std::string&).

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

#include <string>

struct Person {
    const std::string name;
    const std::string gender;
};

, что для многих приложений имеет смысл (например, если вы получаете это из какой-то базы данных, а не отслеживаете имя и пол человека по всему егоживет).

0 голосов
/ 19 сентября 2018

Что-то вроде:

void SetName(CPerson& p, const char* szName) {
    p.name = szName;
}

Будьте осторожны, хотя аргумент szName может указывать на массив, время жизни которого может закончиться до окончания времени жизни CPerson::name.Это делает CPerson::name недопустимым указателем.

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