首页 新闻 会员 周边

C++中的类模板初始化问题

0
悬赏园豆:5 [已解决问题] 解决于 2011-11-19 14:16
//类模板
#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;
}
IceS的主页 IceS | 初学一级 | 园豆:197
提问于:2011-11-15 22:38
< >
分享
最佳答案
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];
}

希望能解决你的问题。

收获园豆:5
胡屯 | 小虾三级 |园豆:714 | 2011-11-16 14:35

C++中有返回空指针吗?C中动态产生的指针是可以转换为任意类型的.不知道这种思维方式行不?

IceS | 园豆:197 (初学一级) | 2011-11-17 21:41

@IceS: 可以。但是这里不是返回值问题,也不是返回指针(T *)。

空指针不能和初始值为 0 的对象划等号。

另外,从程序设计角度来看,你提的返回空指针的思路至少存在两个设计上的误区:

1, 尽量少作转型动作。

2, 尽量避免返回指针,引用或迭代器指向内部成分。

胡屯 | 园豆:714 (小虾三级) | 2011-11-20 10:08
其他回答(1)
0

我的方案

#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;
}
ChatinCode | 园豆:2272 (老鸟四级) | 2011-11-16 15:23
T theMax=(m_Free>0?m_Values[0]:T::minimal);//我修改的

个人理解不是很合适。

这会把CBox 和 CSamples绑在一起,产生了紧耦合关系。

试想一下,我在编写CSample类时还要知道T一定会有一个minimal静态成员,如果CBox以动态库形式提供就更不合适了。

如果一定要有一个minimal,建议在CSample中添加一个const static T minimal成员。

支持(0) 反对(0) 胡屯 | 园豆:714 (小虾三级) | 2011-11-16 16:58

@胡屯: 是有点不大好,它原本的设计就有点问题。这里本来就不应该有空的集合返回Max的,直接抛出异常不结了。现在它一定要返回一个值,那就给它一个了。这里的CSample也是确实要知道CBox的某些东西的。不是所有东西都能作为T放到CSample中的。

支持(0) 反对(0) ChatinCode | 园豆:2272 (老鸟四级) | 2011-11-17 08:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册