程序没错误,但出不来结果,急死了,求各位专家解答,,有点长,请耐心看完

freeqifeng2011 2012-12-17 10:08:03
// hw.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#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();
~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;
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() {}
Media::Media(int)
{
//type=a;
}
Media::~Media()
{
if(name!=NULL)
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.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];
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;
}

...全文
279 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-12-18
  • 打赏
  • 举报
回复
单步调试和设断点调试是程序员必须掌握的技能之一。
freeqifeng2011 2012-12-18
  • 打赏
  • 举报
回复
恩,我知道问题在哪了,非常感谢
swordtan 2012-12-18
  • 打赏
  • 举报
回复
加了一些批注 ++++++++++++++++++++行是必须修改的行,否则程序无法运行,其他的批注是建议


#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;
}
shnaying1945 2012-12-18
  • 打赏
  • 举报
回复
shelf.add(ISAUDIO,"The Color of My Love"); 运行到这步的时候产生错误,再进去,运行到Media的setname时候就产生错误,原因是name非NULL而指向了不该指向的地址,在尝试把它delete的时候被系统阻止,因为那位置是系统保护的地方。 你修改: 在无参构造函数里面对name等char*变量赋予NULL值就可以了。 往下还有类似错误,你自己看着办吧。
freeqifeng2011 2012-12-18
  • 打赏
  • 举报
回复
不明白,能告诉我哪错了吗
freeqifeng2011 2012-12-18
  • 打赏
  • 举报
回复
我是学生,刚开始学c++,还有很多不懂的,各位见笑啦
newtee 2012-12-18
  • 打赏
  • 举报
回复
断点+单步
hekeguang 2012-12-17
  • 打赏
  • 举报
回复
shelf.add(ISAUDIO,"The Color of My Love"); 这句就出错了,我这是,感觉此时Media还没有实例化。
meinanjing 2012-12-17
  • 打赏
  • 举报
回复
看到都吓到了
微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”包含: 1.微信小程序系统教程[阶段]_客服消息 2.微信小程序系统教程[阶段]_微信支付 3.微信小程序系统教程[阶段]_九宝电商系统 学习“微信小程序系统教程[阶段]”要有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[阶段]”。 阶段讲解的客服消息,是针对小程序的。后台程序用接近底层的技术,有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要同学们认真听讲,有不会的技术问题可以教老师。购买课程后联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课咨询qq2326321088

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧