所以我有一个问题已经困扰了我好几天了。我有三个班:电影,沙拉,多库门图。这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很相似。在这一点上并不重要。
那些鸵鸟是我在主要功能上可悲的尝试。我通过一个名为";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...
}
如果您还有任何问题,请随时询问。
不确定是否强烈要求使用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;
};
意识到我已经将字符串表示函数分离为两个单独的函数,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((函数解决了这个问题,我没想到它会那么容易。我想得太多了。