如何在C ++中交换对象数组的2个不同对象?

时间:2019-06-23 09:37:07

标签: c++

我试图编写一个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的一个时,它不起作用!

非常感谢您的帮助。

3 个答案:

答案 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