char* 类型值的交换有关问题
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*的大神给些指导
------解决思路----------------------
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一般都会挂,还有,别忘记释放原来的内存,要不然又会有内存泄露
------解决思路----------------------
这时候明显要做模板特化,或者增加一个模板参数,比如:
template<>
struct EdgeType<char *> // 对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*的大神给些指导
------解决思路----------------------
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一般都会挂,还有,别忘记释放原来的内存,要不然又会有内存泄露
------解决思路----------------------
这时候明显要做模板特化,或者增加一个模板参数,比如:
template<>
struct EdgeType<char *> // 对char *的特化
{
.....// 特殊处理
} ;