将两个复杂的属性重新组合成新的对象

Recombinate two complex attributes into new object

本文关键字:新组合 组合 对象 属性 两个 复杂      更新时间:2023-10-16

我想重新组合两个代理的(复杂)成员属性,并将其放在一个新代理中。它是一个数字向量,每秒钟的值取自agent1,其余的取自agent2。问题是,我希望能够交换我的numberList的实现,也许另一个numberListInt2使用整数或像我的例子中使用浮点数:

#include <vector>
using namespace std;
class NumberList {
};
class NumberListInt : public NumberList {
    vector<int>  number_list {1,2,3};
};
class NumberListFloat : public NumberList {
    vector<float>  number_list  {1.2f,2.5f,30.0f};
};
class Agent {
    NumberList* numbers;
    public:
        Agent();
        Agent(NumberList* numbers) {
            numbers = numberList*
        }
        ~Agent() {
            delete numbers;
        }
        NumberList* recombine(Agent& other) {
            NumberList* new_number_list;
            if(true) // a boolean config value
                new_number_list = new NumberListInt();
            else
                new_number_list = new NumberListFloat();
            for(unsigned int i=0;i<3;i++) {
                if(i%2)
                    new_number_list[i] = other.get_number_list()[i];
                else
                    new_number_list[i] = numbers[i];
            }
            return new_number_list;
        }
        NumberList* get_number_list() {
            return numbers;
        }
};
int main ()
{
    Agent agent;
    Agent agent2;
    Agent agent3(agent.recombine(agent2));
    return 0;
}

我的问题:

  1. 如何实现NumberList[]操作符
  2. 是否有比使用指针的多态性更好的方法?
  3. 释放内存是否正确?

谢谢你的建议!

  1. 问题是operator[]应该返回对NumberList项的引用。但在父类中,你不知道数字的类型。因此,您将无法以多态方式定义此操作符(除非您以某种方式定义多态项)。

  2. 要从多态性中受益,必须使用引用或指针。在您的情况下,指针是一个很好的选择。但是,您必须澄清它们在构造函数中的使用。我假设复制构造函数应该复制对象,而不是重用原始代理的列表。

  3. 不,因为您没有为NumberList定义虚析构函数。当你执行recombine()时,你返回一个新分配的列表。所以调用者必须删除返回的对象。这是非常危险的:如果他忘记了,内存就会泄漏。您最好考虑选择shared_ptr以避免泄漏。

  4. 不清楚是否需要在运行时动态更改NumberList类型。如果不这样做,更安全的方法是使用模板

对于模板,它看起来像:

template <class T>
class NumberList {
    vector<T>  number_list;
    T& operator[] (size_t i) { return numberlist[i]; }  // may be add boundary check ?
};
template <class T> 
class Agent {
    NumberList<T> numbers;  // No more pointer, but directly the object 
    .... 
};