首页 > 解决方案 > 如何在 C++ 中交换对象数组的 2 个不同对象?

问题描述

我正在尝试编写一个交换函数来交换 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 之一时,它不起作用!

非常感谢你的帮助。

标签: c++

解决方案


编辑:重新阅读您的问题,您的指针交换不起作用的原因是因为您没有将指针作为参考传递。如果你坚持调用函数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具有恒定时间交换。


推荐阅读