我试图编写一个Swap函数来交换C ++中数组的2种不同类型的对象。我怎样才能做到这一点? (我更喜欢使用指针来解决此问题)
我尝试使用模板类交换2个对象,因为对象的类型与其他对象不同,并且在遍历数组时,我不知道一个元素属于哪个对象。
我有3个类(Object_A,Object_B和Object_C),如下所示:
class Object_A : public base_class
{
private:
int workingTime;
int relaxTime;
float salary;
public:
Object_A();
virtual ~Object_A();
float Cal_Salary();
int getWorkingTime() const;
void setWorkingTime(int workingTime);
int getRelaxTime() const;
void setRelaxTime(int relaxTime);
float getSalary() const;
void setSalary(float salary);
};
class Object_B : public base_class
{
private:
float income;
public:
Officer();
virtual ~Officer();
float getIncome() const;
void setIncome(float income);
};
class Object_C : public base_class
{
private:
std::string role;
float roleCoef;
float bonus;
public:
Manager();
virtual ~Manager();
float Cal_Bonus();
const std::string& getRole() const;
void setRole(const std::string& role);
float getRoleCoef() const;
void setRoleCoef(float roleCoef);
float getBonus() const;
void setBonus(float bonus);
};
// I tried to write SwapValues func
template<class T, class U>
void SwapValues(T* a, U* b)
{
T temp = a;
a = b;
b = temp;
}
我有一个具有base_class类型的数组,用于存储上面三个对象(Object_A,Object_B和Object_C)的某些元素。 但是,当我想使用SwapValues()函数将Object_A的一个元素交换为Object_C的一个时,它不起作用!
非常感谢您的帮助。
答案 0 :(得分:1)
编辑:重新阅读您的问题,指针交换不起作用的原因是,您没有将指针作为参考传递。如果您坚持要调用函数SwapValues
,则可以这样实现:
class base_class {
// ...
friend void SwapValues(base_class*& a, base_class*& b) {
::std::swap(a,b);
}
};
观察到SwapValues
仍然是自由函数,而不是成员函数。
您应该始终使用::std::swap
,因为它有时会提供有效的替代方法:
::std::swap(*a,*b);
如果要自定义交换的工作方式,也可以在类中实现成员函数。例如,您的成员可以进行有效交换,因为它们是POD或::std::string
,它们具有固定的交换时间。
答案 1 :(得分:0)
我认为您应该尝试
void SwapValues(T* a, U* b)
{
T* temp = a;
a = b;
b = temp;
}
答案 2 :(得分:0)
由于数组由指针(base_class*
元素)组成,因此您不需要自己的交换函数。您只需正常分配此类指针,即可使用std::swap
。