将两个复杂的属性重新组合成新的对象
Recombinate two complex attributes into new object
我想重新组合两个代理的(复杂)成员属性,并将其放在一个新代理中。它是一个数字向量,每秒钟的值取自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;
}
我的问题:
- 如何实现
NumberList
的[]
操作符 - 是否有比使用指针的多态性更好的方法?
- 释放内存是否正确?
谢谢你的建议!
-
问题是
operator[]
应该返回对NumberList
项的引用。但在父类中,你不知道数字的类型。因此,您将无法以多态方式定义此操作符(除非您以某种方式定义多态项)。 -
要从多态性中受益,必须使用引用或指针。在您的情况下,指针是一个很好的选择。但是,您必须澄清它们在构造函数中的使用。我假设复制构造函数应该复制对象,而不是重用原始代理的列表。
-
不,因为您没有为
NumberList
定义虚析构函数。当你执行recombine()
时,你返回一个新分配的列表。所以调用者必须删除返回的对象。这是非常危险的:如果他忘记了,内存就会泄漏。您最好考虑选择shared_ptr
以避免泄漏。 -
不清楚是否需要在运行时动态更改
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
....
};
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 如何在加密++中将两个源组合成新的源
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- C :在新基础中生成组合
- 向 MFC 组合框添加新字符串时触发的断言
- 如何重新组合地图并将元素插入新地图
- r-在C++中的划分与组合(组合数学)实现
- 运算符的使用=与新运算符组合使用
- 函数组合-组合方法优化
- std::ios::openmode的组合,如果文件存在,则截断,但防止创建新文件
- Yaml-cpp(新API) -嵌套映射/序列组合和迭代
- 将两个复杂的属性重新组合成新的对象