Прежде всего, спасибо за попытку найти правильный способ реализации вашего класса, особенно после того, как уже пропустили ответ.
Из вашего описания вверху, я думаю, вы, возможно, неправильно поняли часть того, что просили для этого задания. Во-первых, моя интерпретация заключается в том, что установка значения имени и возраста должна осуществляться в функции init (), а не в конструкторе. Как уже упоминалось в нескольких других статьях, ваш конструктор должен просто инициализировать ваш класс в заведомо исправном состоянии. Например,
Person() {
name = NULL;
age = 0;
}
Затем в вашей функции инициализации вы можете назначить значения. Рассматривая исходную функцию init (), вероятно, следует упомянуть, что простое присвоение значения указателя (char *) другому указателю (char *) копирует только значение указателя, а не данные, которые он представляет. Таким образом, для присвоения значения имени вам нужно рассчитать размер буфера, который вам нужен, выделить буфер и самостоятельно скопировать данные. Основная функция init (), вероятно, будет выглядеть как
init(const char *n, int a) {
// Calculate the required name length plus a NULL-terminator
size_t nameLen = strlen(n) + 1;
// Free any previous value.
if (name != NULL) {
delete[] name;
}
// Allocate the name buffer and copy the name into it.
name = new char[nameLen];
memcpy(name, n, nameLen);
// Store the age.
age = a;
}
Наконец, в вашем деструкторе вы освобождаете любые ресурсы, выделенные вашим классом, в данном случае это буфер имен.
~Person() {
if (name != NULL) {
delete[] name;
}
}
Если у вас есть книга или что-то, связанное с вашим классом, вы можете просмотреть информацию об указателях. Они могут быть немного сложнее, но важно учиться. Я подозреваю, что именно поэтому проблема указана с использованием char * для строк, а не STL-класса.
На ваш вопрос о размещении информации в заголовочных и исходных файлах часто считается хорошей практикой создавать заголовочный файл, который содержит объявление класса и прототипы функций-членов, а затем предоставлять реализацию ваших методов в отдельном исходном файле. Для некоторых простых функций вы можете предоставить реализацию прямо в заголовочном файле.
Ключом при предоставлении определений членов класса в отдельном исходном файле является предоставление имени класса для правильного охвата функции (т. Е. Person: :). Таким образом, ваш заголовочный файл может содержать определение класса, например
// Header file (e.g., person.h)
class Person {
private:
char *name;
int age;
public:
Person() { name = NULL; age = 0 };
~Person() { if (name != NULL) delete[] name; }
void init(const char *n, int a);
// Other method declarations and/or definitions
};
А потом в вашем исходном файле
// Source file (e.g., person.cpp)
void Person::init(const char *n, int a) {
// ...
}
// Rest of method definitions
Исходные файлы, использующие ваш класс person, должны содержать только заголовочный файл с определением вашего класса.