求C++大神解答,一道sql编程与解答题

一道考验你设计能力的C++编程题
看到这道题,我们就开始设计这个图像类了,按照面向对象&依赖倒置&的设计原则,我们站在客户的立场,来考虑我们这个类该提供哪些接口,很快我们设计了如下一个类
class CSimplePicture
CSimplePicture(char* init[], int nCount);
CSimplePicture(CSimplePicture& p1, CSimplePicture& p2, bool bVerCat);
void Frame();
void Print(std::ostream& os)
protected:
std::vector&std::string& m_arD
CSimplePicture(char* init[], int nCount);
根据字符串数组构造一幅图像.
CSimplePicture(CSimplePicture& p1, CSimplePicture& p2, bool bVerCat);
根据两幅图像构造一幅图像,bVerCat表明是纵联接还是横联接.
void Frame();
给图像对象加框
void Print(std::ostream& os)
打印输出图像
std::vector&std::string& m_arD
存储图像数据的字符串数组
下面来考虑具体实现,这个对于有一定开发的经验的人来说还是很容易的,就不具体写了,
CSimplePicture(char* init[], int nCount)无非是数据的拷贝,CSimplePicture(CSimplePicture& p1, CSimplePicture& p2, bool bVerCat)就是把2幅图片的数据连接,合在一起,void Frame()修改里面的数据加上边框,void Print(std::ostream& os) const遍历字符串数组输出。
根据上面的设计和实现,应该已经满足我们这个题目的要求了。
但是客户的需求是多变的,现在客户又有一个新的需求,要求把一幅图片去掉边框。
另外客户觉得我们这个图片类的性能太差了,每次加框或是合成图片都要大量的内存拷贝。
这时我们傻眼了,该死的客户,根据我们上面的设计,根本不支持这些新功能,因为我们存储的是图像的内部的字符串数据,根本不知道它是不是加框过的,另外我们的图像数据本身就是不支持共享的。
接下来我们就要重新考虑设计了,如何让我们的图像对象支持UnFrame(去边框)操作,关键是要建立我们的图像类型层次,这样就可以判断是否是加框的类对象,于是有了如下的类层次:
//图象接口基类
class CPic_Base
//字符串图像类
class CPic_String: public CPic_Base
//加框图像类
class CPic_Frame: public CPic_Base
//纵联接图像类
class CPic_VCat: public CPic_Base
//横联接图像类
class CPic_HCat: public CPic_Base
然后我们考虑如何共享图像数据,这就要用到智能指针了,智能指针在C++里一般有2种实现,一种是STL 里的auto_ptr,还有一种就是基于引用计数。auto_ptr的本质是拥有关系,也就是你拥有了这对象后,别人就不能拥有了,所以这里不符合我们的要求。引用计数是个好东西,对于共享对象特别有用,COM里的IUnknow接口就是基于这个技术的,还有很多脚本语言里变量自动销毁,实际上都是基于引用计数的技术。这里分享一个基于引用计数的智能指针类。
class CRefCountBase
CRefCountBase()
m_nRefCount = 0;
int GetRefCount() const
return m_nRefC
int AddRefCount()
return ++m_nRefC
int SubRefCount()
return --m_nRefC
void ResetRefCount()
m_nRefCount = 0;
int m_nRefC
template&typename T&
class CRefPtr
T* operator-&() const
return m_pRawO
T& operator()() const
return *m_pRawO
T& operator*() const
return *m_pRawO
T* GetPtr() const
return m_pRawO
bool IsNull() const
return m_pRawObj == NULL;
m_pRawObj = NULL;
CRefPtr(T* p)
m_pRawObj =
if(p != NULL)
p-&AddRefCount();
CRefPtr(const CRefPtr& ref)
m_pRawObj = ref.m_pRawO
if(m_pRawObj != NULL)
m_pRawObj-&AddRefCount();
~CRefPtr()
if(m_pRawObj != NULL && m_pRawObj-&SubRefCount() == 0)
delete m_pRawO
CRefPtr& operator = (const CRefPtr& ref)
if(this != &ref)
if(m_pRawObj != NULL
&& m_pRawObj-&SubRefCount() == 0)
delete m_pRawO
m_pRawObj = ref.m_pRawO
if(m_pRawObj != NULL)
m_pRawObj-&AddRefCount();
bool operator == (const CRefPtr& ref) const
return m_pRawObj == ref.m_pRawO
CRefPtr&T& Copy()
if(m_pRawObj != NULL)
T* p = new T(*m_pRawObj);
p-&ResetRefCount();
return NULL;
T* m_pRawO
这样使用这个类
class A: public CRefCountBase
Void fun1();
CRefPtr&A& p = new A;
p-&fun1();
重新设计我们的CPic_Base,
class CPic_Base: public CRefCountBase
virtual ~CPic_Base() {}
//打印输出图像
void Print(std::ostream& os)
//返回图像宽度
virtual int GetWidth() const = 0;
//返回图像高度
virtual int GetHeight() const = 0;
//返回某行的图像字符串数据
virtual std::string GetLineData(int nLineIndex) const = 0;
//返回去掉边框的对象
virtual CRefPtr&CPic_Base& GetUnFrame() const { return NULL; }
这里Print方法实现就很简单了:
void CPic_Base::Print(std::ostream& os) const
for(int i=0; i&GetHeight(); ++i)
os && GetLineData(i);
os && &\n&;
然后考虑实现CPic_String
class CPic_String: public CPic_Base
CPic_String(char* p[], int nCount);
virtual int GetWidth()
virtual int GetHeight()
virtual std::string GetLineData(int nLineIndex)
protected:
std::vector&std::string& m_arD
这个类里存储真正的字符串图像数据,里面方法的实现也很简单,和最开始的的第一种实现类似,就不详写了。
再考虑实现CPic_Frame
class CPic_Frame: public CPic_Base
CPic_Frame(CRefPtr&CPic_Base&& pic);
virtual int GetWidth()
virtual int GetHeight()
virtual std::string GetLineData(int nLineIndex)
virtual CRefPtr&CPic_Base& GetUnFrame() const { return m_ }
protected:
CRefPtr&CPic_Base& m_
可以看到这里我们引用了一个其他的图像数据,而不是真正存储这些数据,方法实现也很简单, 主要依赖于m_pic所指向的图像类,同时m_pic是个基于引用计数的智能指针, 所以赋值时也没有内存拷贝, 注意GetUnFrame这个方法只有这里返回非NULL,表示只有这种对象支持去边框。
CPic_Frame::CPic_Frame(CRefPtr&CPic_Base&& pic)
: m_pic(pic)
_ASSERTE(!m_pic.IsNull());
int CPic_Frame::GetWidth() const
return m_pic-&GetWidth() + 2;
int CPic_Frame::GetHeight() const
return m_pic-&GetHeight() + 2;
string CPic_Frame::GetLineData(int nLineIndex) const
int nWidth = GetWidth();
int nHeight = GetHeight();
_ASSERTE(nLineIndex & nHeight && nLineIndex &= 0);
if(nLineIndex == 0 //first line and last line
|| nLineIndex == nHeight - 1)
int nPadding = nWidth - 2;
return string(&+&) + string(nPadding, '-') + string(&+&);
return string(&|&) + m_pic-&GetLineData(nLineIndex - 1) + string(&|&);
再考虑实现CPic_VCat
class CPic_VCat: public CPic_Base
CPic_VCat(CRefPtr&CPic_Base&& pic1, CRefPtr&CPic_Base&& pic2);
virtual int GetWidth()
virtual int GetHeight()
virtual std::string GetLineData(int nLineIndex)
protected:
CRefPtr&CPic_Base& m_pic1;
CRefPtr&CPic_Base& m_pic2;
他里面存储了上下2个图像对象,方法实现是也不复杂,就不具体写了。
另外CPic_HCat也是类似:
class CPic_HCat: public CPic_Base
CPic_HCat(CRefPtr&CPic_Base&& pic1, CRefPtr&CPic_Base&& pic2);
virtual int GetWidth()
virtual int GetHeight()
virtual std::string GetLineData(int nLineIndex)
protected:
CRefPtr&CPic_Base& m_pic1;
CRefPtr&CPic_Base& m_pic2;
有了上面的实现,现在我们可以这么实现我们需要的功能了:
Int main()
char* init1[] = {&Paris&, &in the&, &Spring&};
CRefPtr&CPic_Base& p1 = new CPic_String(init, 3);
CRefPtr&CPic_Base& p2 = new CPic_Frame(p1);
CRefPtr&CPic_Base& p3 = new CPic_VCat(p1, p2);
P3-&Print(cout);
CRefPtr&CPic_Base& p4 = p2-&GetUnFrame();
这时我们发现这样对于客户调用很不友好,因为我们内部实现的类层次都暴露给客户了,而这些信息对客户来说应该都是透明的,我们应该再封装一个更简单的界面类给客户。
于是有了如下的设计,其实接口类似我们的第一种实现。
class CPicture
CPicture(char* p[], int nCount);
CPicture(CPicture& p1, CPicture& p2, bool bVerCat);
void Frame();
bool UnFrame();
friend std::ostream& operator && (std::ostream& os, const CPicture& pic);
protected:
CRefPtr&CPic_Base& m_
std::ostream& operator && (std::ostream& os, const CPicture& pic);
这样对客户来说他们只需要和CPicture打交道,根本不用关心内部的实现。
这个类的实现也很简单:
CPicture::CPicture(char* p[], int nCount)
m_pic = new CPic_String(p, nCount);
CPicture::CPicture(CPicture& pic1, CPicture& pic2, bool bVerCat)
if(!bVerCat)
m_pic = new CPic_HCat(pic1.m_pic, pic2.m_pic);
m_pic = new CPic_VCat(pic1.m_pic, pic2.m_pic);
void CPicture::Frame()
m_pic = new CPic_Frame(m_pic);
bool CPicture::UnFrame()
CRefPtr&CPic_Base& p = m_pic-&GetUnFrame();
if(!p.IsNull())
return !p.IsNull();
std::ostream& operator && (std::ostream& os, const CPicture& pic)
pic.m_pic-&Print(os);
下面是我们使用这个类的代码:
char* init1[] = {&Paris&, &in the&, &Spring&};
char* init2[] = {&Hello world&, &every&, &thing&, &is&, &OK!&};
int main(int argc, char* argv[])
CPicture p1(init1, 3);
CPicture p2(init2, 5);
std::cout && p1;
cout &&endl &&
std::cout && p2;
cout &&endl &&
p2.Frame();
cout && p2;
cout &&endl &&
p1.Frame();
p1.Frame();
cout && p1;
cout &&endl &&
CPicture pHorCat(p1, p2, false);
cout && pHorC
cout &&endl &&
CPicture pVerCat(p1, pHorCat, true);
cout && pVerC
cout &&endl &&
pVerCat.Frame();
cout && pVerC
cout &&endl &&
pVerCat.Frame();
cout && pVerC
cout &&endl &&
pVerCat.UnFrame();
pVerCat.UnFrame();
cout && pVerC
cout &&endl &&
system(&pause&);
可以看到使用起来非常方便和友好,运行截图:
可以看到使用第二种实现我们只存储了一份字符串图像数据,同时有保留了图像的层次和结构属性,实现时包含了很多设计模式,比如Template, Decorate, Composite, faced等,简单而高效。
最后我们对这2种实现方式作下比较:
方法1的优势是数据完整,修改一个对象时不会影响其他对象,因为每个对象都是数据的单独拷贝。劣势是低效,不能体现对象的结构属性,我们不知道这个对象是加边框的对象还是上下合成的对象。
方法2的优势是高效,数据共享,同时有保留有对象的结构属性。劣势是修改一个对像时会影响其他的对象,因为他们可能是共享同一个对象。实际上,对于基于引用计数的共享对象,还有一种叫做Write Copy(写入时拷贝)的技术,就是如果你要修改一个对象,就自己拷贝一份。同时引用计数技术还有一个风险就是循环引用,比如A引用了B,B也引用了A,这2个对象就永远没法释放了,这也是要谨慎的。
上面完美的解决了我们UnFrame(去边框)的问题,我们正对我们使用基于引用计数的技术来完美的构造字符串图像类层次而洋洋得意,但是好景不长。
一个星期后,客户又找到你提了他的新需求,他想让你的CPicuture类增加一个功能,能返回一个XML格式的字符串来告诉他该对象的构造过程。
返回的XML串是
& CPic_Frame &
&CPic_String& Paris in the Spring &/CPic_String&
&/ CPic_Frame &
+-------+Paris
|Paris |in the
|in the |Spring
返回的XML串是
& CPic_HCat &
& CPic_Frame &
&CPic_String& Paris in the Spring &/CPic_String&
&/ CPic_Frame &
&CPic_String& Paris in the Spring &/CPic_String&
&/ CPic_HCat &
+-------+Paris
|Paris |in the
|in the |Spring
返回的XML串是
&CPic_VCat&
& CPic_HCat &
& CPic_Frame &
&CPic_String& Paris in the Spring &/CPic_String&
&/ CPic_Frame &
&CPic_String& Paris in the Spring &/CPic_String&
&/ CPic_HCat &
&CPic_String& Paris in the Spring &/CPic_String&
&/CPic_VCat&
你不禁抱怨道,该死的客户,上次已经因为要支持UnFrame功能而让我改变了最初的设计,如果没有客户的新需求,开发该是一件多么美好的事情。
但是抱怨归抱怨,客户就是上帝,你还是只能硬这头皮把事情做完。
那现在让我们来考虑如果实现这一功能。
一开始想到的当然是在我们的CPic_Base基类中增加一个接口,比如
String GetStructXMLString();
但是面向对像的设计原则告诉我们,接口不该随便改动,实际上次CPic_Base里为UnFrame而增加的CRefPtr&CPic_Base& GetUnFrame()接口已经让你觉得很不爽,感觉这个接口和我们的图像对象没有直接关系。
那么我们是否考虑可以重构CPic_Base接口,让它能以插件的形式实现各种功能,也就是说我们的类层次这里是固定的,但是方法却可以一直增加而不影响原有的代码。
这时我们想到了Visitor模式,它基本上是为我们这类需求而量身定做的。
对于Visitor模式的架构,基本上是固定的,定义个IPic_Visitor
class IPic_Visitor
virtual void VisitPicString(CPic_String& pic) {};
virtual void VisitPicFrame(CPic_Frame& pic) {} ;
virtual void VisitPicVCat(CPic_VCat& pic) {};
virtual void VisitPicHCat(CPic_HCat& pic) {};
virtual ~IPic_Visitor() {}
在我们的CPic_Base基类里增加一个Accept接口virtual void Accept(IPic_Visitor& visitor) = 0;
这样图像对象就可以让各种类型的Visitor访问了,各个图像类的实现也很简单:
void CPic_String::Accept(IPic_Visitor& visitor)
visitor.VisitPicString(*this);
void CPic_Frame::Accept(IPic_Visitor& visitor)
visitor.VisitPicFrame(*this);
void CPic_VCat::Accept(IPic_Visitor& visitor)
visitor.VisitPicVCat(*this);
void CPic_HCat::Accept(IPic_Visitor& visitor)
visitor.VisitPicHCat(*this);
好了,现在我们用一个新Visitor来改写我们原来的UnFrame功能,
class CUnFrameVisitor: public IPic_Visitor
virtual void VisitPicFrame(CPic_Frame& pic);
CRefPtr&CPic_Base& GetUnFrameResult();
protected:
CRefPtr&CPic_Base& m_picR
因为Visitor方法都是没有返回值,参数也是固定的,所以一般都是通过在Visitor里保存成员变量和返回接口来实现返回值的。
这样实现就很简单了:
void CUnFrameVisitor::VisitPicFrame(CPic_Frame& pic)
m_picRet = pic.m_
CRefPtr&CPic_Base& CUnFrameVisitor::GetUnFrameResult()
return m_picR
可以看到只有访问 CPic_Frame才有非空的返回值;其他都是用默认的空方法,最终返回的也就空对象。
这样我们在最终暴露的CPicture里实现UnFrame也就很简单了:
bool CPicture::UnFrame()
m_pic-&Accept(vistor);
CRefPtr&CPic_Base& pRet = vistor.GetUnFrameResult();
if(!pRet.IsNull())
m_pic = pR
return !pRet.IsNull();
接下来我们考虑如何实现客户的要求返回XML串的需求,实际上我们前面的Visitor模式已经为我们准备好了条件,我们只需要新增加一个Visitor&&
class CStructXMLVisitor: public IPic_Visitor
virtual void VisitPicString(CPic_String& pic);
virtual void VisitPicFrame(CPic_Frame& pic);
virtual void VisitPicVCat(CPic_VCat& pic);
virtual void VisitPicHCat(CPic_HCat& pic);
std::string GetStructXMLString() { return m_strStructXML;}
protected:
std::string m_strStructXML;
实现也不复杂:
void CStructXMLVisitor::VisitPicString(CPic_String& pic)
m_strStructXML = &&CPic_String&&;
int nHeight = pic.GetHeight();
for(int i=0;i&nH ++i)
m_strStructXML += pic.GetLineData(i);
m_strStructXML += &&/CPic_String&&;
void CStructXMLVisitor::VisitPicFrame(CPic_Frame& pic)
CStructXMLV
pic.m_pic-&Accept(v);
m_strStructXML = &&CPic_Frame&&;
m_strStructXML += v.GetStructXMLString();
m_strStructXML += &&/CPic_Frame&&;
void CStructXMLVisitor::VisitPicVCat(CPic_VCat& pic)
m_strStructXML = &&CPic_VCat&&;
CStructXMLVisitor v1;
pic.m_pic1-&Accept(v1);
m_strStructXML += v1.GetStructXMLString();
CStructXMLVisitor v2;
pic.m_pic2-&Accept(v2);
m_strStructXML += v2.GetStructXMLString();
m_strStructXML += &&/CPic_VCat&&;
void CStructXMLVisitor::VisitPicHCat(CPic_HCat& pic)
m_strStructXML = &&CPic_HCat&&;
CStructXMLVisitor v1;
pic.m_pic1-&Accept(v1);
m_strStructXML += v1.GetStructXMLString();
CStructXMLVisitor v2;
pic.m_pic2-&Accept(v2);
m_strStructXML += v2.GetStructXMLString();
m_strStructXML += &&/CPic_HCat&&;
然后我们在我们的CPicture界面里增加一个GetStructXMLString方法,实现也很简单:
std::string CPicture::GetStructXMLString()
CStructXMLV
m_pic-&Accept(v);
return v.GetStructXMLString();
可以看到,改用新的设计之后,以后我们再有什么新需求,只要直接增加一个Visitor就好了, 所以说设计不是一层不变的,要根据需求不停的重构。
最后贴一下类图,外部只要和CPicture打交道就可以了:
源代码下载:
作者:Richard Wei
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'求一道c++编程题验证卡不列克运算任意一个四位数,只要它们各个位 - 爱问知识人
(window.slotbydup=window.slotbydup || []).push({
id: '2491531',
container: s,
size: '150,90',
display: 'inlay-fix'
求一道c++编程题
答案如下: 在附件中;
网络搜索的(Pascal版、C版、C++版):看了一下,根据卡布列克常数的定义,下面的几种程序实现包括输入数、数的各位取出、排序以求最大和最小、求差最后获取该常...
大家还关注查看:1530|回复:16
1,定义抽象类point,含有纯虚函数area()。
2,定义point的派生类locetion包含私有成员x,y 公有成员:构造和析构函数,求面积函数area()和位置信息函数get_x()和get_y。
3,定义locetion的派生类circle,包涵私有成员radius和公有成员函数:构造和析构函数,求面积函数area()调用基类函数球的位置信息。
4,定义locetion的派生类rectangle,包涵私有成员high,wide和公有成员函数:构造和析构函数求面积函数area()
5,由circle类派生出圆柱体类型lylinder,定义构造和析构函数,求表面积面积函数area(),调用基类函数求的位置信息
6,编写主函数验证类设计的合理性
在线等。。急急急,求助求助!
杜绝一切不加思索的提问,
有什么不明白可以提问,
或者 自己编写,我们给予修改
只有你爬到山顶了,这座山才会支撑着你。
主要真的什么都不会,我真的很想找个人从这道题开始一部部讲解一下。。:'(
答题框架,剩下自己一边查书,一边学习吧复制内容到剪贴板代码:class point
& && & virtual&&double area()=0;
class locetion:public point
& && &&&locetion()//构造函数
& && && && && & ,,,,,,,,,
& && &&&~locetion()//析构函数
................
& && &&&double area()
class circle:public locetion
& && &&&构造
& && && && && & 析构
& && && && && & double area()
class lylinder:public rectangle
& && &&&构造//析构//area
本帖最后由 月夜幻影 于
14:49 编辑
只有你爬到山顶了,这座山才会支撑着你。
请问能加您QQ请教一下么。。。一部一部
论坛 我每天都会上的
你随时都可以问
PS:这个你真要认真看了 很快就可以完成
就涉及到构造函数和析构函数,外加一个area;
框架都给你列出来了
只有你爬到山顶了,这座山才会支撑着你。
我想知道你有没看过C++基础的。
复制内容到剪贴板代码:#include &iostream&
class point
virtual float area()=0;
class locetion:public point
locetion(float x,float y){length=x;width=y;}
float area(){return length*}
class circle:public point
circle(float x){radius=x;}
~circle();
float area(){return radius*radius*3.14;}
class rectangle:public point
rectangle(float x,float y){length=x;width=y;}
float area(){return length*width/2;}
class lylinder:public point
lylinder(float x,float h){radius=x;high=h;}
float area(){return radius*radius*3.14*}
int main()
point *p1;
bool quit=
cout&&&(1)正方体(2)圆(3)三角形(4)圆柱体(5)退出&&&
switch(choice)
case 1:p1=new locetion(5.0,9.0);
cout&&&正方形的面积为:&&&p1-&area()&&
case 2:p1=new circle(6.0);
cout&&&圆形的面积为:&&&p1-&area()&&
case 3:p1=new rectangle(3.0, 6.0);
cout&&&三角形的面积为:&&&p1-&area()&&
case 4:p1=new lylinder(7.0,8.0);
cout&&&圆柱体的面积为:&&&p1-&area()&&
case 5:quit=
default:cout&&&请输入1至5之间的数&&&
if(choice&1&&choice&5)
delete p1;
}//这里我全部是继承基类的。继承派生类的,其实就是为了初始化参数,但是参数的个数总不一样,导致编译器老报错说什么构造函数不匹配;求各位高手帮忙改成题目要求。。。
本帖最后由 月夜幻影 于
14:04 编辑
前几天又满课,没得学了。。现在是从头看起了,不过感觉还是很远的感觉。我再研究一下
刚开始看。。。
你比我好多了。我是完全写不出东西
引用:原帖由 qx5201314 于
09:54 发表
class point
virtual float area()=0;
class locetion:public point
locetion(float x,float y){length=x;width=y;}
float area(){return length*}
pr ... return radius*radius*3.14*high
因为3.14为double型,所以 radius*radius*3.14*high为double型;
返回结果为float,结果不精确,float有效位少于double;
float均改为double 就可以了
本帖最后由 月夜幻影 于
14:40 编辑
只有你爬到山顶了,这座山才会支撑着你。
引用:原帖由 lianzai06 于
13:49 发表
你比我好多了。我是完全写不出东西 还是自己好好学吧
这样的问题
大部分论坛 都不会给别人做作业的;
这次你就多谢你楼上吧。
只有你爬到山顶了,这座山才会支撑着你。
这这题目写的并怎么明了;
只是凭感觉写了下复制内容到剪贴板代码:#include &iostream&
class point
& & & & virtual double area()=0;
class locetion:public point
& & & & locetion(double x_loc=0.0,double y_loc=0.0){x=x_y=y_}
& & & & virtual double area(){return 0;}
& & & & double get_x()
& & & & & & & &
& & & & double get_y()
& & & & & & & &
& & & & ~locetion(){}
class circle:public locetion
& & & & circle(double x,double y):radius(x,y){}
& & & & ~circle(){};
& & & & double area(){return (pow(radius.get_x(),2)+pow(radius.get_y(),2))*3.14;}
class rectangle:public locetion
& & & & rectangle(double x1,double y1)
& & & & & & & & :length(x1,0),width(0,y1){}
& & & & double area(){return length.get_x()*width.get_y();}
class lylinder:public circle
& & & & lylinder(double x,double y,double z):circle(x,y),high(0,z){}
& & & & double area(){return circle::area()*high.get_y();}
int main()
& & & & point *p1;
& & & & bool quit=
& & & & while(1)
& & & & & & & & cout&&&(1)圆(2)矩形(3)圆柱体(4)退出&&&
& & & & & & & & cin&&
& & & & & & & & switch(choice)
& & & & & & & & {
& & & & & & & & case 1:p1=new circle(6.0,7.0);
& & & & & & & & & & & & cout&&&圆形的面积为:&&&p1-&area()&&
& & & & & & & & case 2:p1=new rectangle(3.0, 6.0);
& & & & & & & & & & & & cout&&&三角形的面积为:&&&p1-&area()&&
& & & & & & & & case 3:p1=new lylinder(7.0,8.0,9.0);
& & & & & & & & & & & & cout&&&圆柱体的面积为:&&&p1-&area()&&
& & & & & & & & case 4:quit=
& & & & & & & & default:cout&&&请输入1至5之间的数&&&
& & & & & & & & }
& & & & & & & & if(choice&1&&choice&4)
& & & & & & & & {
& & & & & & & & & & & & delete p1;
& & & & & & & & }
& & & & & & & & if(quit)
& & & & & & & & {
& & & & & & & & & & & &
& & & & & & & & }
& & & & return 0;
只有你爬到山顶了,这座山才会支撑着你。
学习了,原来是这么初始化参数的!可是我复制你的代码在运行时报错,说pow没定义....
本帖最后由 qx5201314 于
20:59 编辑
#include&cmath&
只有你爬到山顶了,这座山才会支撑着你。
提示: 作者被禁止或删除 内容自动屏蔽}

我要回帖

更多关于 sql编程与解答 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信