Итак, у меня есть проблема, которая беспокоит меня уже несколько дней. У меня 3 класса: Кино, Чалад, Документ. Эти 3 класса описывают категории фильмов / фильмов, в основном «Csalad» - это фильмы для семейного просмотра, «Dokumentum» - документальный фильм. А все остальное - в Кинематографическом классе. Класс Film - это родительский класс, у которого есть несколько небольших «массивов» с частным типом char * (например, char * cim [25 + 1], это для заголовка). И у его дочерних классов есть некоторые специальные частные переменные, такие как: char * eletkor [2 + 1] для класса Csalad. Проблема в том, что я успешно прочитал свои данные из txt-файла в синхронно связанный список (в txt-файле каждая строка имеет особый тип, и я могу легко решить, какой фильм в какой категории, и поместить их в правильный класс, например: если что-то простое, я делаю для них в конструкторе Film, если это семейный фильм, я делаю их в конструкторе Csalad). Но у меня проблемы с выводом их на экран. Моя основная цель - просмотреть свой связанный список и, по сути, распечатать все данные на экране. Звучит просто, но это не так, потому что я не могу найти метод, который мог бы одновременно распечатать заголовок, например (который находится в классе Film и наследуется каждым другим классом, таким как Csalad), и может распечатать частный Csalad. переменная элеткор.
Ребята, вы можете мне помочь?
Вот код:
«kov» на английском означает «следующий».
Film.h
#include <cstring>
#include <iostream>
class Film{
private:
char cim[25+1], kiadas[4+1], idotartam[4+1], tema[25+1];
int hossz;
public:
Film* kov;
//Konstruktor
Film(char* dcim, char* dkiadas, char* didotartam, char* dtema, int dhossz){
strcpy(cim, dcim);
strcpy(kiadas, dkiadas);
strcpy(idotartam, didotartam);
strcpy(tema, dtema);
kov = NULL;
hossz = dhossz;
}
//Masolo konstruktor
Film(const Film& masolando){
strcpy(this->cim, masolando.cim);
strcpy(this->kiadas, masolando.kiadas);
strcpy(this->idotartam, masolando.idotartam);
strcpy(this->tema, masolando.tema);
this->kov = masolando.kov;
}
//Getterek
char* getCim(){
return cim;
}
int getHossz(){
return hossz;
}
};
Csalad.h
#include "Film.h"
class Csalad : public Film{
private:
char eletkor[2+1];
public:
Csalad(char* dcim, char* dkiadas, char* didotartam, char* dtema, char* deletkor, int dhossz):Film(dcim, dkiadas, didotartam, dtema, dhossz){
strcpy(eletkor, deletkor);
}
char* getEletkor(){
return eletkor;
}
std::ostream& print(std::ostream& os){
os << "Cs.Cim: " << getCim() << " " << "Eletkor: " << getEletkor();
return os;
}
};
Dokumentum.h похож на Csalad.h, на данный момент это не имеет значения.
Эти потоки были моей жалкой попыткой в основной функции. Я создаю связанный список с помощью функции beolvas, которая выдает указатель типа Film *. Итак, мой main выглядит примерно так:
int main(){
Film* eleje = NULL;
eleje = beolvas(eleje);
if (eleje == NULL){
cout << "Hiba a beolvasással" << endl;
return 1;
}
}
Что касается печатной части, я пытался сделать что-то вроде этого:
for(*SOME KIND OF A TYPE OR SOMETHING* mozgo = eleje; mozgo != NULL; mozgo = mozgo->kov){
printing...
}
Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.
Я попробую это, но одним из критериев является то, что я не могу (не должен) использовать контейнеры STL, и я думаю, что эта строка является одним из них. (Спасибо за ";", я исправил)
Да, это действительно так. Хорошо, это прискорбно.





Не уверен, что использование массивов char является строгим требованием, но я объясню одну возможную реализацию, которую вы можете реализовать со стандартным C++. Знайте, что все операции std::string имеют эквивалентную операцию в стиле C, которую вы можете выполнить (хотя и с гораздо большим количеством стандартного кода).
Учтите следующие ограничения:
Сначала давайте рассмотрим строковое представление для Film и его производных классов.
#include <string> //std::string
#include <sstream> //std::stringstream
class Film
{
public:
std::string toString()const
{
std::stringstream ss;
ss << "Title: " << title;
ss << toStringDerived();
return ss.str();
}
virtual std::string toStringDerived()const { return ""; }
private:
std::string title;
};
Поймите, что я разделил функции строкового представления на 2 отдельные функции, toString и toStringDerived. Все классы, унаследованные от Film, теперь имеют возможность переопределить их функцию строкового представления.
Разделение базового определения из производного определения для toString также добавляет одно преимущество: все производные классы всегда будут печатать свойства базового класса, пока вызывающий сайт использует функцию toString, предоставленную в базовом классе.
Теперь давайте посмотрим на возможную реализацию производного класса
class FamFriendly : public Film
{
public:
virtual std::string toStringDerived()const override
{
std::stringstream ss;
ss << "Family: " << family << "\n";
return ss.str();
}
private:
std::string family;
};
Мы видим, что производный класс имеет возможность настраивать свою часть собственного строкового представления, не зная строковое представление базовых классов.
Теперь использование будет таким
Film* currFilm = getFilmLinkedList(...);
while(currFilm != nullptr)
{
std::cout << currFilm->toString() << "\n"
currFilm = currFilm->next();
}
Виртуальная функция print () решила проблему, я не думал, что это будет так просто. Я над этим подумал.
Думали ли вы об использовании
std::stringвместоchar[]? Это делает все намного проще.