我在排序一个自定义类的Elevator的std :: vector后遇到了问题。
课程定义:
class Elevator
{
private:
uint16_t m_id;
char *m_channel;
ElevatorType m_type;
public:
Elevator(uint16_t id, const char *channel, ElevatorType type);
Elevator(const Elevator &other);
~Elevator();
char *ToCString();
bool operator<(const Elevator& rhs) const;
static vector<Elevator> *ElevatorsFromWorkbook(const char *path);
};
运营商较少的实施方式如下:
bool Elevator::operator<(const Elevator& rhs) const
{
return (this->m_id < rhs.m_id);
}
ToCString 方法实现如下:
char *Elevator::ToCString()
{
char *output = (char*)malloc(sizeof(char) * (8+strlen(m_channel)));
char type = 'U';
if (m_type == ELEVATOR_TYPE_A)
{
type = 'A';
}
else if (m_type == ELEVATOR_TYPE_G)
{
type = 'G';
}
else if (m_type == ELEVATOR_TYPE_M)
{
type = 'M';
}
sprintf(output,"%d %s %c",m_id,m_channel,type);
return output;
}
复制构造函数:
Elevator::Elevator(const Elevator &other)
{
m_id = other.m_id;
m_channel = (char*)malloc(sizeof(char)*(strlen(other.m_channel)+1));
strcpy(m_channel,other.m_channel);
m_type = other.m_type;
}
问题示例:
std::vector<Elevator> elevators;
elevators.push_back(Elevator(4569,"CHANNEL3",ELEVATOR_TYPE_G));
elevators.push_back(Elevator(4567,"CHANNEL3",ELEVATOR_TYPE_G));
printf("%s\n",elevators.at(0).ToCString()); //Prints "4567 CHANNEL1 G"
std::sort(elevators.begin(),elevators.end());
printf("%s\n",elevators.at(0).ToCString()); //ISSUE: Prints "4567 4567 ▒#a G"
我做错了什么?谢谢你的时间!
关于编译的注意事项:我正在使用带有这些标志的Cygwin: -Wall -Wextra -fno-exceptions -fno-rtti -march = pentium4 -O2 -fomit-frame-pointer -pipe
答案 0 :(得分:1)
根据标准,std::sort
要求对象为可交换,这意味着您可以在其上调用swap
。由于您没有swap
重载,这意味着std::swap
。 std::swap
说
要求:类型T应为MoveConstructible(表20)和MoveAssignable(表22)。
(那是C ++ 11。用C ++ 03的“复制”替换“移动”。)
您的类不是CopyAssignable,因为它没有operator=
重载,所以您应该添加它。 (参见What is The Rule of Three?)请注意,复制构造可以从默认构造和operator=
合成。