关于new与new[]的用法!急!!!!!!!!!!!!!!!!!!!!

jackytan_2008 2006-04-26 04:29:56
//personqueue.h
//personQueue class definition.
#ifndef PERSONQUEUE_H
#define PERSONQUEUE_H

class Person; //forward declaration
const int nDefaultQueueSize = 20;

class PersonQueue
{
public:
PersonQueue(int);
~PersonQueue();
//........


private:
Person *personPtr; //存放队列元素的指针(数组)
int size; //队列大小(容量)
int front; //队首位置
int rear; //队尾位置(最后一个元素的下一位置)
int count; //队列中元素的个数


};//end PERSONQUEUE_H
#endif
//personqueue.cpp
// Member-function definitions for class personqueue

#include <iostream>
using namespace std;

#include "personqueue.h" //personqueue class definition
#include "person.h" //person class definition


//constructor
PersonQueue::PersonQueue(int initSize = nDefaultQueueSize)
{
if(initSize < 1)
initSize = nDefaultQueueSize;
personPtr = new Person[initSize];//问题就出在这一语句
if (!personPtr)
{
cerr << "存储空间分配失败,应用程序将终止!"
<< endl;
exit(1);
}
front = 0;
rear = 0;
count = 0;
size = initSize;
}

//destructor
PersonQueue::~PersonQueue()
{
if (personPtr) delete [] personPtr;
front = 0;
rear = 0;
count = 0;
size = 0;
}

Person类声明
// person.h
// Person class definition.
#ifndef PERSON_H
#define PERSON_H

class Floor; // forward declaration
class Elevator; // forward declaration

class Person {
friend class PersonQueue;
public:
Person( int ); // constructor
~Person(); // destructor
Person& operator = (Person&);
void* operator new[]( unsigned int);
void* operator new( unsigned int);
void operator delete[](void*);
void operator delete(void*);


private:
static int personCount; // total number of people
int ID; // person's unique ID #
int destinationFloor; // destination floor #



}; // end class Person


#endif // PERSON_H
// person.cpp
// Member-function definitions for class Person.
#include <iostream>

using std::cout;
using std::endl;
using std::cerr;

#include "person.h" // Person class definition
#include "floor.h" // Floor class definition
#include "elevator.h" // Elevator class definition

// initialize static member personCount
int Person::personCount = 0;

// constructor
Person::Person( int destFloor )
: ID( ++personCount ),
destinationFloor( destFloor )
{
cout << "person " << ID << " constructed" << endl;

} // end Person constructor

// destructor
Person::~Person()
{
cout << "(person " << ID << " destructor invoked)" << endl;

} // end ~Person destructor

Person& Person::operator = (Person& per)
{
if (this != &per)
{
this ->personCount = per.personCount;
this ->ID = per.ID;
this ->destinationFloor = per.destinationFloor;
}
return *this;
}

void* Person::operator new[]( unsigned int size)
{
return operator new(size);
}

void* Person::operator new( unsigned int size)
{
void *p = (void *)malloc(size * sizeof(Person));
if(!p)
{
cerr<<"malloc is not successful" <<endl;
exit(1);
}
return p;
}

void Person::operator delete[](void* p)
{
operator delete(p);
}

void Person::operator delete(void* p)
{
if(p)
free(p);
}
这是一个关于人(对象)进入队列的实现,但在我的队列的类分配Person[size]时,说找不到默认的构造函数,不知道怎么解决,其他函数没问题,由于涉及的类太多,所以就拷了两个下来(如果大家要运行上面的代码,就将Person里面的其他不用的东西去掉就行),关于这个new[],我重载没问题,就是在另一个类(PersonQueue)里面出了问题,大家以前有没有出现这样的情况啊?有的就帮我看看啊,谢谢啊!!!!!
急啊!!!!!!!!!!!!!!!!!!明天就离开了,今晚一定要搞定呢!谢,在VC6.0下的错误如下:
personqueue.cpp(20) : error C2512: 'Person' : no appropriate default constructor available
Error executing cl.exe.
...全文
229 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackytan_2008 2006-04-26
  • 打赏
  • 举报
回复
谢谢了!就给分,谢谢各位!!!!!!!!
以前我也接触过这个问题的,想不到遇到就不会了,谢谢各位提醒!!!!!!!!
cutenoob 2006-04-26
  • 打赏
  • 举报
回复
jf jf....
anwsp 2006-04-26
  • 打赏
  • 举报
回复
因为你提供了有参数的构造函数,那么你new的时候,会调用构造函数。
如果你没提供构造函数,则系统会调用无参数默认构造函数.
本例中: 没有调用Person默认构造函数,加一个成员 Person(){} 就可以了。
tutu_cloud 2006-04-26
  • 打赏
  • 举报
回复
当对象在数组中被构造时,它的缺省构造函数会被调用,即ClassName::ClassName(),但是你所定义的Person类里面根本没有这样形式的构造函数,自然会出错。这个和你类中的operator new与operator new[]没关系。这个问题可以通过以下方式解决
1。加入缺省构造函数,如Person::Persion()
2。在已有构造函数的参数后添加缺省值,如Person::Person(int destFloor=-1)
healer_kx 2006-04-26
  • 打赏
  • 举报
回复
Person 没有默认构造函数,
和 new 没关系呀,
加一个成员 Person(){} 就可以了


因为你提供了有参数的构造函数,那么你new的时候,会调用构造函数。
无参的默认构造要手动给出了。
adintr 2006-04-26
  • 打赏
  • 举报
回复
Person 没有默认构造函数,和 new 没关系呀,
加一个成员 Person(){} 就号了

65,186

社区成员

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

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