64,637
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<string.h>
#define MAX_STR_LEN 256
#define ISAUDIO 1
#define ISVIDEO 2
#define ISNULL 0
using namespace std;
class Media {
friend void setA(Media &medium, char *n, char* c);
public:
Media(char *n, char *c);
Media(int);
Media();
virtual ~Media();
char * getName(char *str);
char * getCompany(char *str);
virtual void showInfo() const;
static int getObjNum();
void setType(int t);
void setName(char * name);
void show();
bool operator !();
private:
char *name; // 建议用string,方便管理资源
char * company;
int type;
static int objNum;
};
Media::Media(char *n, char *c) {
name = new char[strlen(n) + 1];
strcpy(name, n);
company = new char[strlen(c) + 1];
strcpy(company, c);
type = ISNULL;
// name = NULL; // 这里赋值错误++++++++++++++++++++++++++
objNum++;
}
Media::Media() {
name = NULL; // 需要初始化指针值++++++++++++++++++++++++
company = NULL;
type = ISNULL;
}
Media::Media(int) {
Media();
//type=a;
}
Media::~Media() {
if (name != NULL) // 这里可以不需要,delete会自动判断是否为空
delete[] name;
if (company != NULL)
delete[] company;
objNum--;
}
void Media::showInfo() const {
cout << "Name:" << this->name << endl;
cout << "Company:" << this->company << endl;
}
/*void Media::show()
{
cout<<"Media object."<<endl;
}*/
char *Media::getName(char *str) {
strcpy(str, name);
return str;
}
char *Media::getCompany(char *str) {
strcpy(str, company);
return str;
}
void Media::setName(char * n) {
if (name != NULL)
delete[] name;
if (n != NULL) {
name = new char[strlen(n) + 1];
strcpy(name, n);
} else
name = NULL;
}
void Media::setType(int t) {
if (t == ISAUDIO || t == ISVIDEO)
type = t;
}
void Media::show() {
cout << name << "is a";
if (type == ISAUDIO)
cout << "audio disc.";
else if (type == ISVIDEO)
cout << "video disc.";
}
bool Media::operator !() {
if (name == NULL || strlen(name) == 0)
return true;
return false;
if (company == NULL || strlen(company) == 0) // 这部分代码怎么也执行不到,逻辑有问题
return true;
return false;
}
void setA(Media &medium, char *n, char*c) { // 这个比较危险,medium会自动释放堆资源
medium.name = n;
medium.company = c;
}
int Media::objNum = 0;
int Media::getObjNum() {
return objNum;
}
class AudioMedia: public Media {
public:
AudioMedia(int num, char *n, char *c, char *s);
AudioMedia();
~AudioMedia();
char * getSinger(char *str);
void showInfo() const;
//void show();
private:
int no;
char * singer;
};
AudioMedia::AudioMedia(int num, char *n, char *c, char*s) :
Media(n, c) {
no = num;
singer = new char[strlen(s) + 1];
strcpy(singer, s);
}
AudioMedia::~AudioMedia() {
if (singer != NULL)
delete[] singer;
}
void AudioMedia::showInfo() const {
Media::showInfo();
cout << "Singer:" << this->singer << endl;
}
/*void AudioMedia::show()
{
cout<<"AudioMedia object."<<endl;
}*/
char *AudioMedia::getSinger(char *str) {
strcpy(str, singer);
return str;
}
class VideoMedia: public Media {
public:
VideoMedia(char *n, char *c, char *d, char *a);
~VideoMedia();
char * getDirector(char *str);
char * getActor(char *str);
void showInfo() const;
private:
char *director;
char *actor;
};
VideoMedia::VideoMedia(char *n, char *c, char *d, char *a) :
Media(n, c) {
director = new char[strlen(d) + 1];
strcpy(director, d);
actor = new char[strlen(a) + 1];
strcpy(actor, a);
}
VideoMedia::~VideoMedia() {
if (director != NULL)
delete[] director;
if (actor != NULL)
delete[] actor;
}
void VideoMedia::showInfo() const {
Media::showInfo();
cout << "Director:" << this->director << endl;
cout << "Actor:" << this->actor << endl;
}
char *VideoMedia::getDirector(char *str) {
strcpy(str, director);
return str;
}
char *VideoMedia::getActor(char *str) {
strcpy(str, actor);
return str;
}
class Shelf {
public:
Shelf() {
num = 0;
}
int add(int t, char * n);
void list();
private:
Media media[MAX_STR_LEN]; // 这里推荐使用容器,比如vector<Media *>,注意在Shelf的析构函数中,释放所有的Media对象
int num;
};
//Shelf::Shelf()
int Shelf::add(int t, char * n) {
if (num >= MAX_STR_LEN)
return 0;
media[num].setType(t);
media[num].setName(n);
num++;
return 1;
}
void Shelf::list() {
int i;
for (i = 0; i < num; i++) {
cout << "No." << i + 1 << ":";
media[i].show();
}
}
int main() {
try {
Shelf shelf;
shelf.add(ISAUDIO, "The Color of My Love");
shelf.add(ISAUDIO, "Thriller");
shelf.add(ISVIDEO, "Forrest Gump");
shelf.add(ISVIDEO, "Slumdog Millionaire");
shelf.list();
Media medium("Slumdog Millionaire", "Celador Films");
if (!medium)
cout << "medium is NULL!" << endl;
else
cout << "medium is not NULL!" << endl;
AudioMedia audio(1, "The Color of My Love", "Columbia", "Celine Dion");
VideoMedia video("Forrest Gump", "Paramount Pictures",
"Robert Zemeckis", "Tom Hanks");
cout << "Audio Media:" << endl;
audio.showInfo();
cout << endl;
cout << "Video Media:" << endl;
video.showInfo();
cout << endl;
char strBuffer[MAX_STR_LEN];
Media *mPtr;
mPtr = &medium;
cout << "Accessing Media object through Media*:" << endl;
cout << "Name:" << mPtr->getName(strBuffer) << endl;
cout << "Company:" << mPtr->getCompany(strBuffer) << endl;
cout << endl;
mPtr = &audio;
cout << "Accessing AudioMedia object through Media*:" << endl;
//cout<<"Name:"<<mPtr->getName(strBuffer)<<endl;
//cout<<"Company:"<<mPtr->getCompany(strBuffer)<<endl;
//cout<<"Singer:"<<((AudioMedia*)mPtr)->getSinger(strBuffer)<<endl;
mPtr->showInfo();
cout << endl;
mPtr = &video;
cout << "Accessing VideoMedia object through Media*:" << endl;
cout << "Name:" << mPtr->getName(strBuffer) << endl;
cout << "Company:" << mPtr->getCompany(strBuffer) << endl;
cout << "Director:" << ((VideoMedia*) mPtr)->getDirector(strBuffer)
<< endl;
cout << "Actor:" << ((VideoMedia*) mPtr)->getActor(strBuffer) << endl;
cout << endl;
AudioMedia *amPtr;
amPtr = (AudioMedia*) &medium;
cout << "Accessing Media object through AudioMedia*:" << endl;
cout << "Name:" << amPtr->getName(strBuffer) << endl;
cout << "Company:" << amPtr->getCompany(strBuffer) << endl;
//cout<<"Singer:"<<amPtr->getSinger(strBuffer)<<endl;
cout << endl;
amPtr = &audio;
cout << "Accessing AudioMedia object through AudioMedia*:" << endl;
cout << "Name:" << amPtr->getName(strBuffer) << endl;
cout << "Company:" << amPtr->getCompany(strBuffer) << endl;
cout << "Singer:" << amPtr->getSinger(strBuffer) << endl;
cout << endl;
medium.showInfo();
setA(medium, "s", "c");
medium.showInfo();
AudioMedia am2(2, "Thriller", "Abm", "Michael Jackson");
FILE * fptr;
if ((fptr = fopen("am.dat", "wb")) != NULL) {
fwrite(&medium, sizeof(AudioMedia), 1, fptr);
fwrite(&am2, sizeof(AudioMedia), 1, fptr);
fclose(fptr);
} else
cout << "Open file or create file error." << endl;
cout << "There is" << Media::getObjNum() << "media." << endl;
{
Media one(10);
Media *ptr = &one;
cout << "After media one created,there is" << one.getObjNum()
<< "media." << endl;
{
Media two(10);
cout << "After media two created,there is" << two.getObjNum()
<< "media." << endl;
}
cout << "After media two destroyed,there is" << ptr->getObjNum()
<< "media." << endl;
}
cout << "After media one destroyed,there is" << Media::getObjNum()
<< "media." << endl;
} catch (...) {
cout << "Error" << endl;
}
return 0;
}