Односвязный список, конструктор
Нужно создать список, и провести некоторые работы, но не получается вызвать конструктор, не могу понять, как сделать. Строка ниже отмечена комментарием.
class Students {
public:
Students();
~Students();
void push_back(int marks[8], char name[20], int volume);
private:
class Node {
Node* pNext;
char name[20];
int marks[8]; // Оценки
int volume; // стипендия
Node(int marks[8], char name[20], int volume, Node* pNext = nullptr) {
this->marks[8] = marks[8];
this->pNext = pNext;
this->name[20] = name[20];
this->volume = volume;
}
};
int Size;
Node* head;
};
Students::Students() {
Size = 0;
head = nullptr;
}
Students::~Students() {
}
void Students::push_back(int marks[8], char name[20], int volume) {
if (head = nullptr) {
head = new Node(marks[8], name[20], volume); // Выдает ошибку отсутствует экземпляр конструктора
}
else {
}
}
Ответы (1 шт):
Автор решения: Ariox
→ Ссылка
В C++ нельзя передавать массивы фиксированного размера по значению. Можно передавать по указателю (и копировать вручную), можно по ссылке int (&marks)[8], можно через std::array: std::aray<int, 8> marks. В нормальном C++ более-менее корректный вариант выглядел бы так:
#include <string>
#include <array>
class Students{
struct Node{
std::string name;
std::array<int, 8> works;
int volume;
Node* next;
};
size_t size = 0;
Node* head = nullptr;
public:
// Конструктор по умолчанию инициализирует нулями, т.к. заданы значения по умолчанию
Students() = default;
// works тут можно передавать и по ссылке, но для малых массивов (примерно до 10 машинных слов) смысла добавлять дополнительную косвенность нет.
void push_back(const std::string& name, std::array<int, 8> works, int volume){
if (head == nullptr) {
// Конструктор для чистых структур генерируется автоматически
head = new Node{name, works, volume, nullptr};
size = 1;
} else{
// ....
}
}
};
С инкапсуляцией тут проблем нет, т.к. Node - приватная структура.
Если вам нельзя использовать библиотечные классы - передавайте как int (&marks)[8] или const int* marks, но не забудьте, что нужно копировать данные, а не указатели.