【问题标题】:Trying to print out the elements of a linked list (with multiple classes)试图打印出链表的元素(具有多个类)
【发布时间】:2021-06-28 06:21:28
【问题描述】:

所以我有一个问题困扰了我好几天。我有 3 个课程:电影、沙拉、Dokumentum。这 3 个类描述了电影/电影类别,基本上“Csalad”是家庭电影,“Dokumentum”是文档电影。其他一切都在电影类中。 Film 类是父类,它有一些私有 char* 类型的小“数组”(如:char* cim[25+1],这是标题)。它的子类有一些特殊的私有变量,例如: Csalad 类的 char* eletkor[2+1]。 问题是我已经成功地将我的必需数据从一个 txt 文件读取到一个同步链表中(在 txt 文件中,每一行都有一个特殊的类型,我可以很容易地决定哪部电影属于哪个类别,并将它们放入正确的类,例如:如果某件事是我在 Film 构造函数中为他们制作的简单电影,如果这是一部适合家庭的电影,我在 Csalad 构造函数中制作它们)。但是我在将它们打印到屏幕上时遇到了问题。 我的主要目标是浏览我的链表,基本上将每一个数据都打印到屏幕上。这听起来很简单,但事实并非如此,因为我找不到一个既可以打印出标题的方法(例如,它位于 Film 类中,并且由像 Csalad 这样的每个其他类继承)又可以打印出 Csalad 的私有变量 eletkor。

你们能帮帮我吗?

这里有一些代码:

“kov”在英文中是next的意思。

电影.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 相似,此时并不重要。

那些 ostream 是我在主要功能中的可悲尝试。我通过一个名为“beolvas”的函数创建了链表,它给出了一个 Film* 类型的指针。所以我的主要看起来像这样:

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[]?它使一切变得容易得多。
  • 我会尝试,但其中一个标准是我不能(不得)使用 STL 容器,我认为字符串就是其中之一。 (感谢“;”提醒,我已更正)
  • 是的,确实如此。好吧,那很不幸。

标签: c++ class linked-list


【解决方案1】:

不确定是否强烈要求使用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 个单独的函数,toStringtoStringDerived。从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();
}

【讨论】:

    【解决方案2】:

    一个虚拟的 print() 函数解决了这个问题,我没想到它会那么容易。我想多了。

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多