Code Bye

char* 类型值的交换问题

我定义了一个EdgeType结构体模版
template<class T>
struct EdgeType<T>
{
     T head;
     T tail;
     int cost;
     EdgeType(T h,T t,int c)
{
head=h;
tail=t;
cost=c;
}
}
然后在实际应用的时候T是char*类型保存字符串。
现在使用一个vector里面保存了n个EdgeType<char*>类型的元素,需要给它们按照cost大小排序,我选择了冒泡排序,但是在交换第j和第j+1个元素的值的时候char*出现了问题。我重载了=运算符,使用了strcpy进行head和tail值的交换(实际这种做法应该不太好,因为实际我并不知道T是char*类型,这样做实际默认了T是char*类型,并不符合模版的定义,不知道有没有其他方法)但是这样做编译能通过,运行确出错了,下面是我的重载函数:
void operator=(const EdgeType<T> & b)
{
                strcpy(this->head,b.head);           //调试程序的时候到这里就出错了
strcpy(this->tail,b.tail);
this->cost=b.cost;
}
外部的排序的部分代码是:
if(graph[j].cost>graph[j+1].cost)
{
tmp=graph[j];
graph[j]=graph[j+1];
graph[j+1]=tmp;
}
运行出错的提示是Unhandled exception in 邻接矩阵.exe:0xC0000005:Access Violation
不知道有没有比较懂得char*的大神给些指导

10分
EdgeType(T h,T t,int c)
{
head=h;
tail=t;
cost=c;
}
这构造函数就有问题,head和tail如果都是char *,怎么能用指针赋值呢?要申请内存再strcpy吧
void operator=(const EdgeType<T> & b)
{
                strcpy(this->head,b.head);           //调试程序的时候到这里就出错了
strcpy(this->tail,b.tail);
this->cost=b.cost;
}
这里也是类似的问题,head没有内存,直接用strcpy一般都会挂,还有,别忘记释放原来的内存,要不然又会有内存泄露
引用 1 楼 hnwyllmm 的回复:

EdgeType(T h,T t,int c)
{
head=h;
tail=t;
cost=c;
}
这构造函数就有问题,head和tail如果都是char *,怎么能用指针赋值呢?要申请内存再strcpy吧
void operator=(const EdgeType<T> & b)
{
                strcpy(this->head,b.head);           //调试程序的时候到这里就出错了
strcpy(this->tail,b.tail);
this->cost=b.cost;
}
这里也是类似的问题,head没有内存,直接用strcpy一般都会挂,还有,别忘记释放原来的内存,要不然又会有内存泄露

噢~~有道理,但是我还是有一个问题,因为书上的要求是要使用类模版,实际head类型是T类型,并不知道是char*,如果我为head 成员new了空间,等于说我的模版就没有使用,默认 就是char*类型,没有意义了,我要如何修改呢?

10分
引用 2 楼 u014050788 的回复:
Quote: 引用 1 楼 hnwyllmm 的回复:

这里也是类似的问题,head没有内存,直接用strcpy一般都会挂,还有,别忘记释放原来的内存,要不然又会有内存泄露

噢~~有道理,但是我还是有一个问题,因为书上的要求是要使用类模版,实际head类型是T类型,并不知道是char*,如果我为head 成员new了空间,等于说我的模版就没有使用,默认 就是char*类型,没有意义了,我要如何修改呢?

这时候明显要做模板特化,或者增加一个模板参数,比如:
template<>
struct EdgeType<char *>  // 对char *的特化
{
…..// 特殊处理
} ;

引用 3 楼 hnwyllmm 的回复:
Quote: 引用 2 楼 u014050788 的回复:
Quote: 引用 1 楼 hnwyllmm 的回复:

这里也是类似的问题,head没有内存,直接用strcpy一般都会挂,还有,别忘记释放原来的内存,要不然又会有内存泄露

噢~~有道理,但是我还是有一个问题,因为书上的要求是要使用类模版,实际head类型是T类型,并不知道是char*,如果我为head 成员new了空间,等于说我的模版就没有使用,默认 就是char*类型,没有意义了,我要如何修改呢?

这时候明显要做模板特化,或者增加一个模板参数,比如:
template<>
struct EdgeType<char *>  // 对char *的特化
{
…..// 特殊处理
} ;

噢~~这样啊。。我也不太了解模版的特化,学习到了!太感谢了!


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明char* 类型值的交换问题