Попытка распечатать элементы связанного списка (с несколькими классами)

Итак, у меня есть проблема, которая беспокоит меня уже несколько дней. У меня 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...
}

Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.

Думали ли вы об использовании std::string вместо char[]? Это делает все намного проще.

Ted Lyngmo 01.04.2021 12:04

Я попробую это, но одним из критериев является то, что я не могу (не должен) использовать контейнеры STL, и я думаю, что эта строка является одним из них. (Спасибо за ";", я исправил)

Bence Hérincs 01.04.2021 13:17

Да, это действительно так. Хорошо, это прискорбно.

Ted Lyngmo 01.04.2021 13:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не уверен, что использование массивов 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 () решила проблему, я не думал, что это будет так просто. Я над этим подумал.

Другие вопросы по теме