65,210
社区成员
发帖
与我相关
我的任务
分享
#include <iostream.h>
#include <cstdlib>
#include <ctime>
using std::cout;
using std::endl;
#include "Box.h"
#include "List.h"
#include "BoxPtr.h"
inline int random(int count){
return 1+static_cast<int>
(count*static_cast<double>(std::rand())/(RAND_MAX+1.0));
}
int main(){
const int dimLimit=100;
std::srand((unsigned)std::time(0));
const int boxCount=20;
Box boxes[boxCount];
for(int i=0;i<boxCount;i++)
boxes[i]=Box(random(dimLimit),random(dimLimit),random(dimLimit));
TruckLoad load=TruckLoad(boxes,boxCount);
BoxPtr pLoadBox(load);
Box maxBox=*pLoadBox;
if(pLoadBox)
cout<<endl<<"Volume of first Box is "<<pLoadBox->volume();
while(++pLoadBox)
if(maxBox<*pLoadBox)
maxBox=*pLoadBox;
cout<<endl
<<"The largest box in the list is "
<<maxBox.getLength()<<" by "
<<maxBox.getWidth()<<" by "
<<maxBox.getHeight()<<" by "
<<maxBox.volume()<<endl;
return 0;
}
class Box{
private:
double length;
double width;
double height;
static int objectCount;
public:
//Box();
Box(double aLength=1.0,double aWidth=1.0,double aHeight=1.0);
//~Box();
double volume ()const;
double getLength()const;
double getWidth()const;
double getHeight()const;
void pr();
bool operator<(const Box& aBox)const;
bool operator<(const double aValue)const;
Box operator+(const Box& aBox)const;
//Box operator=(Box& aBox);
int compareVolume (const Box & otherBox)const;
Box* setLength(double lvalue);
Box* setWidth(double wvalue);
Box* setHeight(double hvalue);
static double sam(Box theBox);
int getObjectCount()const;
};
inline bool Box::operator<(const Box& aBox)const{
return volume()<aBox.volume();
};
inline bool Box::operator<(const double aValue )const{
return volume()<aValue;
};
inline Box Box::operator+(const Box& aBox)const {
return Box(length>aBox.length?length:aBox.length,
width<aBox.width?width:aBox.width,
height+aBox.height);
};
//inline Box Box::operator=(Box& aBox){
// this->length=aBox.length;
//this->width=aBox.width;
//this->height=aBox.height;
//return *this;
//}
inline bool operator<(const double aValue,const Box& aBox){
return aValue<aBox.volume();
};
#include<iostream>
#include"Box.h"
using std::cout;
using std::endl;
//Box::Box(){
// cout<<"Default constructor called"<<endl;
// ++objectCount;
// length=width=height=1.0;}
Box::Box(double aLength,double aWidth, double aHeight){
double maxSide=aLength>aWidth?aLength:aWidth;
double minSide=aLength<aWidth?aLength:aWidth;
length=maxSide>0.0?maxSide:1.0;
width=minSide>0.0?minSide:1.0;
height=aHeight>0.0?aHeight:1.0;}
//Box::~Box(){
// cout<<"Box destructor called. "<<endl;
//}
double Box::volume()const{
return length*width*height;
}
double Box::getLength()const{
return length;
}
double Box::getWidth()const{
return width;
}
double Box::getHeight()const{
return height;
}
int Box::compareVolume(const Box& otherBox)const{
double vol1=volume();
double vol2=otherBox.volume();
return vol1>vol2?1:(vol1<vol2?-1:0);
}
Box* Box::setLength(double lvalue){
if(lvalue>0)length=lvalue;
return this;
}
Box* Box::setWidth(double wvalue){
if(wvalue>0)width=wvalue;
return this;
}
Box* Box::setHeight(double hvalue){
if(hvalue>0)height=hvalue;
return this;
}
void Box::pr(){
cout<<this->length<<" "<<this->width<<" "<<this->height<<" "<<endl;
}
int Box::getObjectCount()const{
return objectCount;
}
double Box::sam(Box theBox){
return theBox.length+theBox.width+theBox.height;
}
int Box::objectCount=0;
class BoxPtr{
public:
BoxPtr(TruckLoad& load);
Box& operator*()const;
Box* operator->()const;
Box* operator++();
const Box* operator++(int);
operator bool();
private:
Box*pBox;
TruckLoad& rLoad;
BoxPtr();
BoxPtr(BoxPtr&);
BoxPtr& operator=(const BoxPtr&);
};
using std::cout;
using std::endl;
BoxPtr::BoxPtr(TruckLoad& load):rLoad(load){
pBox=rLoad.getFirstBox();
}
Box& BoxPtr::operator*()const{
if(pBox)
return *pBox;
else{
cout<<endl<<"Dereferencing null BoxPtr";
return *pBox;
}
}
Box* BoxPtr::operator->()const{
return pBox;
}
Box* BoxPtr::operator++(){
return pBox=rLoad.getNextBox();
}
const Box* BoxPtr::operator++(int){
Box* pTemp=pBox;
pBox=rLoad.getNextBox();
return pTemp;
}
BoxPtr::operator bool(){
return pBox!=0;
}
class TruckLoad{
public:
TruckLoad(Box* pBox=0,int count=1);
~TruckLoad();
TruckLoad(const TruckLoad& load);
TruckLoad&operator=(const TruckLoad& load);
Box operator[](int index)const;
Box* getFirstBox();
Box* getNextBox();
void addBox(Box* pBox);
private:
class Package{
public:
Package(Box* pNewBox);
~Package();
Package(Box& pNewBox);
void setNext(Package* pPackage);
Box* pBox;//一个包含Box类型的引用
Package* pNext;//一个Paclage类型的指针变量
};
Package* pHead;
Package* pTail;
Package* pCurrent;};
using std::cout;
using std::endl;
TruckLoad::Package::Package(Box* pNewBox):pBox(pNewBox),pNext(0){}//package对象有两个数据
//一个是box类型的指针pBox,一个是指向下一个box类型的package类型指针pNext。
TruckLoad::Package::~Package(){
cout<<"Package destructor called. "<<endl;
}
void TruckLoad::Package::setNext(Package* pPackage){pNext=pPackage;}//该函数接受package类型的指针参数
//将他赋值给pNext数据 (存储私有数据)
TruckLoad::TruckLoad(Box* pBox,int count){
pHead=pTail=pCurrent=0;//如果不带参数的默认构造函数,三个指针数据都为空
if((count>0)&&(pBox!=0))//带参数且count大于0,构建count个box对象
for(int i=0;i<count;i++)
addBox(pBox+i);
return;
}//(建立链表对象)
TruckLoad::~TruckLoad(){
cout<<"TruckLoad destructor called. "<<endl;
while(pCurrent=pHead->pNext){
delete pHead;
pHead=pCurrent;
}
delete pHead;
};
TruckLoad::TruckLoad(const TruckLoad& load){
pHead=pTail=pCurrent=0;
if(load.pHead==0)
return;
Package* pTemp=load.pHead;
do{
addBox(pTemp->pBox);
}while(pTemp=pTemp->pNext);
}
void TruckLoad::addBox(Box* pBox){
Package* pPackage=new Package(pBox);//将参数pBox传来的地址传给一个新的Package
//类型的对象,并赋值给一个pPackage临时指针。
if(pHead)//如果该函数的Truckload对象的head指针存在
pTail->pNext==pPackage;//将新对象的首地址作为参数,传送给当前Tail指针指向的对象的pNext数据
else
pHead=pPackage;//将head指针指向新对象的首地址
pTail=pPackage;//将Tail指针指向新对象的首地址
}//(建立package对象并将他们相连 )
Box* TruckLoad::getFirstBox(){
pCurrent=pHead;//将Head指针的地址传给Current指针
return pCurrent->pBox;//返还Current指针指向对象的pBox指针
}//(获取第一个Box对象的地址)
Box* TruckLoad::getNextBox(){
if(pCurrent)//如果Current指针存在
pCurrent=pCurrent->pNext;//将当前Current指针指向的对象的pNext指针地址传给Current指针。
else
pCurrent=pHead;//将Head指针地址传给Current指针
return pCurrent?pCurrent->pBox:0;//如果Current指针存在,返还它当前所指向对象的pBox地址,否则返还0
}//(访问下一个Box对象的地址)
Box TruckLoad::operator[](int index)const{
if(index<0){
cout<<endl<<"Negative index";
return *pTail->pBox;
}
Package*pPackage=pHead;
int count=0;
do{
if(index==count++)
return *pPackage->pBox;
}while(pPackage=pPackage->pNext);
cout<<endl<<"Out of range index ";
return *pTail->pBox;
}
TruckLoad& TruckLoad::operator=(const TruckLoad& load){
if(this==&load)
return*this;
while(pCurrent=pHead){
pHead=pHead->pNext;
delete pCurrent;
}
pHead=pTail=pCurrent=0;
if(load.pHead==0)
return*this;
Package* pTemp=load.pHead;
do{
addBox(pTemp->pBox);
}while(pTemp=pTemp->pNext);
return*this;
}
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)