//类模板
#include<iostream>
using std::cout;
using std::endl;
class CBox
{
private:
double m_Length;
double m_Width;
double m_Height;
public:
explicit CBox(double lv=1.0,double wv=1.0,double hv=1.0):m_Length(lv),m_Width(wv),m_Height(hv)
{
cout<<"默认的构造函数"<<endl;
m_Length=lv>wv?lv:wv;//长度不会小于宽度
m_Width=wv<lv?wv:lv;//宽度最小
}
double Volume() const
{
return m_Length*m_Width*m_Height;
}
bool operator>(const CBox &aBox)const
{
return this->Volume()>aBox.Volume();
}
bool operator>(const double &value)const
{
return this->Volume()>value;
}
CBox operator+(const CBox & aBox)const
{
//创建一个新对象,选择大
return CBox(this->m_Length>aBox.m_Length?this->m_Length:aBox.m_Length,
this->m_Width>aBox.m_Width?this->m_Width:aBox.m_Width,
this->m_Height>aBox.m_Height?this->m_Height:aBox.m_Height);
}
void SHowBox() const
{
cout<<this->m_Length<<""<<m_Width<<""<<m_Height<<endl;
}
};
bool operator>(const double &value,const CBox &aBox);
bool operator>(const double &value,const CBox &aBox)
{
return value>aBox.Volume();
}
template<class T>class CSamples
{
private:
T m_Values[100];
int m_Free;
public:
CSamples(const T values[],int count);
CSamples(const T& value);
CSamples(){m_Free=0;}
bool Add(const T& value);
T Max() const;
};
template<class T>CSamples<T>::CSamples(const T values[],int count)
{
m_Free=count<100?count:100;
for(int i=0;i<m_Free;i++)
m_Values[i]=values[i];
}
template<class T>CSamples<T>::CSamples(const T& value)
{
m_Value[0]=value;
m_Free=1;
}
template<class T> bool CSamples<T>::Add(const T& value)
{
bool OK=m_Free<100;
if(OK)
m_Values[m_Free++]=value;
return OK;
}
template<class T> T CSamples<T>::Max() const
{
T theMax=(m_Free>0?m_Values[0]:0);//有问题不能通过,如何初始化???
for(int i=1;i<m_Free;i++)
if(m_Values[i]>theMax)
theMax= m_Values[i];
return theMax;
}
int main()
{
CBox boxes[]={
CBox(8.0,5.0,2.0),
CBox(5.0,4.0,6.0),
CBox(4.0,3.0,3.0)
};
CSamples<CBox> myBoxes(boxes,sizeof boxes/sizeof CBox);
CBox maxBox = myBoxes.Max();
cout<<endl
<<"The biggest box has a volume of"
<<maxBox.Volume()<<endl;
return 0;
}
T theMax=(m_Free>0?m_Values[0]:0);
在实例化CSamples<CBox>类模板是,如何用0作为参数构造CBox呢?
因为CBox类没有定义这样的构造函数。
代码修改后可以是这样的。
//T theMax=(m_Free>0?m_Values[0]:0);//有问题不能通过,如何初始化???
T theMax;//这里调用缺省构造函数,如果一定要初始化为0.0需要修改缺省构造函数
if (m_Free > 0)
{
theMax = m_Values[0];
}
希望能解决你的问题。
C++中有返回空指针吗?C中动态产生的指针是可以转换为任意类型的.不知道这种思维方式行不?
@IceS: 可以。但是这里不是返回值问题,也不是返回指针(T *)。
空指针不能和初始值为 0 的对象划等号。
另外,从程序设计角度来看,你提的返回空指针的思路至少存在两个设计上的误区:
1, 尽量少作转型动作。
2, 尽量避免返回指针,引用或迭代器指向内部成分。
我的方案
#include<iostream>
using std::cout;
using std::endl;
class CBox
{
private:
double m_Length;
double m_Width;
double m_Height;
public:
explicit CBox(double lv=1.0,double wv=1.0,double hv=1.0):m_Length(lv),m_Width(wv),m_Height(hv)
{
cout<<"默认的构造函数"<<endl;
m_Length=lv>wv?lv:wv;//长度不会小于宽度
m_Width=wv<lv?wv:lv;//宽度最小
}
double Volume() const
{
return m_Length*m_Width*m_Height;
}
bool operator>(const CBox &aBox)const
{
return this->Volume()>aBox.Volume();
}
bool operator>(const double &value)const
{
return this->Volume()>value;
}
CBox operator+(const CBox & aBox)const
{
//创建一个新对象,选择大
return CBox(this->m_Length>aBox.m_Length?this->m_Length:aBox.m_Length,
this->m_Width>aBox.m_Width?this->m_Width:aBox.m_Width,
this->m_Height>aBox.m_Height?this->m_Height:aBox.m_Height);
}
void SHowBox() const
{
cout<<this->m_Length<<""<<m_Width<<""<<m_Height<<endl;
}
static CBox minimal; //我添加的
};
bool operator>(const double &value,const CBox &aBox);
bool operator>(const double &value,const CBox &aBox)
{
return value>aBox.Volume();
}
template<class T>class CSamples
{
private:
T m_Values[100];
int m_Free;
public:
CSamples(const T values[],int count);
CSamples(const T& value);
CSamples(){m_Free=0;}
bool Add(const T& value);
T Max() const;
};
template<class T>CSamples<T>::CSamples(const T values[],int count)
{
m_Free=count<100?count:100;
for(int i=0;i<m_Free;i++)
m_Values[i]=values[i];
}
template<class T>CSamples<T>::CSamples(const T& value)
{
m_Value[0]=value;
m_Free=1;
}
template<class T> bool CSamples<T>::Add(const T& value)
{
bool OK=m_Free<100;
if(OK)
m_Values[m_Free++]=value;
return OK;
}
template<class T> T CSamples<T>::Max() const
{
T theMax=(m_Free>0?m_Values[0]:T::minimal);//我修改的
for(int i=1;i<m_Free;i++)
if(m_Values[i]>theMax)
theMax= m_Values[i];
return theMax;
}
CBox CBox::minimal = CBox(0.0, 0.0, 0.0);//我添加的
int main()
{
CBox boxes[]={
CBox(8.0,5.0,2.0),
CBox(5.0,4.0,6.0),
CBox(4.0,3.0,3.0)
};
CSamples<CBox> myBoxes(boxes,sizeof boxes/sizeof CBox);
CBox maxBox = myBoxes.Max();
cout<<endl
<<"The biggest box has a volume of"
<<maxBox.Volume()<<endl;
return 0;
}
T theMax=(m_Free>0?m_Values[0]:T::minimal);//我修改的
个人理解不是很合适。
这会把CBox 和 CSamples绑在一起,产生了紧耦合关系。
试想一下,我在编写CSample类时还要知道T一定会有一个minimal静态成员,如果CBox以动态库形式提供就更不合适了。
如果一定要有一个minimal,建议在CSample中添加一个const static T minimal成员。
@胡屯: 是有点不大好,它原本的设计就有点问题。这里本来就不应该有空的集合返回Max的,直接抛出异常不结了。现在它一定要返回一个值,那就给它一个了。这里的CSample也是确实要知道CBox的某些东西的。不是所有东西都能作为T放到CSample中的。