Как инициализировать значения класса, который находится в другом классе?
У меня есть класс Node, в котором есть 3 значения. Этот класс является членом класса Contacts. Как мне сделать конструктор в классе Contacts что бы инициализировать значения класса Node. Не передачей члена класса Note в конструктор, а именно значениями.
class Node//Класс узла
{
private:
NOTE data; // Поле данных, содержащее данные типа NOTE
Node* next; // Указатель на следующий элемент
Node* prev; // Указатель на предыдущий элемент
public:
Node(NOTE data, Node* pNext = nullptr, Node* pPrev = nullptr) // конструктор ноды присваивание значения и адреса
{
this->data = data;
this->next = pNext;
this->prev = pPrev;
};
};
Этот класс является членом другого класса
#pragma once
#include <string>
using namespace std;
class NOTE
{
private:
string name;//Имя Фамилия
string phone;//Номер телефона
string birthday;//Дата рождения
public:
NOTE();//Конструктор по умолчанию
NOTE(string n, string p, string b);//Конструктор
string GetName();//Получение значения имени
string GetPhone();//Получение значения номера телефона
string GetBirthdat();//Получение значения дня рождения
void SetName(string n);//Установка Имени
void SetPhone(string p);//Установка номера телефона
void SetBirthday(string b);//Установка Дня Рождения
};
Ответы (2 шт):
Из вопроса не совсем понял как устроен класс Contacts но допустим так:
class Contacts
{
private:
NOTE data;
// ... еще что-то ...
};
Конструктор класса Contacts тогда должен выглядеть примерно так:
Contacts::Contacts(const string& name, const string& phone, const string& birthday):
data(name, phone, birthday)
{
//... работаем с другими полями ...
}
Но полагаю класс Contacts должен содержать в себе много записей типа NOTE, следовательно нужно передавать в конструктор Contacts не одну, а несколько наборов полей. Можно сделать это так:
Создать дополнительно структуру например Data
struct Data
{
const string name;
const string phone;
const string birthday;
}
Которая будет служить только для передачи данных в конструктор (можно объявить эту структуру рядом с Contacts):
class Contacts
{
private:
std::list<NOTE> data; //Теперь не одна запись
// ... еще что-то ...
};
Contacts::Contacts(const std::list<Data>& a_data):
{
//Или как-то подругому вставлять если вы не со списком работаете
for (auto d: a_data)
data.push_back(NOTE(d.name, d.phone, d.birthday));
//... работаем с другими полями ...
}
Или можно std::tuple использовать вместо вспомогательной структуры Data
Я думаю ваш класс Contacts имеет примерно такое поле:
Node* contacts;
И как я понял вы хотите вместо примерно такой записи:
Contacts(Node* contact)
Вот такую:
Contacts(string name, string phone, string birthday)
То есть вместо конструктора инициализации, вы хотите как бы раскрыть структуру Node, а в последствие и Note. Т.к. это конструктор, то next и prev никуда не будут указывать и их можно не требовать для передачи, так что раскрываем саму структуру Note где у вас 3 поля типа string.
Ну и сам конструктор:
Contacts(string name, string phone, strng birthday) {
contacts = new Node({ name, phone, birthday });
}
Ну а так дальше можно гадать, что у вас там в классе Contacts