gpt4 book ai didi

C++重用对象以使用抽象基类实现多态性

转载 作者:行者123 更新时间:2023-11-28 06:49:02 25 4
gpt4 key购买 nike

我是 C++ 的新手,正在弄清楚如何为我正在处理的特定项目使用多态性。

我有一个组件列表。每个组件都有一个与之关联的分数,该分数是使用逻辑计算的。所以我有一个抽象类:

class Component {
public:
int compute_score(request *r) =0;
int get_score() { return score; }
protected:
int score;
};

现在每个Component都继承这个抽象基类来实现自己的计算组件分数的逻辑。最终的算法是将所有的 Component 分数组合起来。

// Compute and combine scores
for (int ndx = 0; ndx < num_components; ndx++) {
total += components[ndx]->compute_score();
}
combined_score = total/num_components;

现在我正尝试将此模型融入现有代码库。有一个名为请求的大结构,我想向其中添加这些组件对象并计算分数。

struct request {
...
Component *components[num_components];
...
};

void serve(request *r) {
...
// Compute and combine scores
for (int ndx = 0; ndx < num_components; ndx++) {
total += components->compute_score();
}
combined_score = total/num_components;
...
}

// Listener
void start(request *r) {
// Listen for request
// Serve the request
serve(&r);
// Clear the request struct for reuse
memset(r, 0, sizeof(request));
}

int main() {
// Created only once and then reused
request *req = (request*) calloc(1, sizeof(calloc));
start(&req);
}

使用组件数组的可能性:

  1. 在调用 serve() 时动态创建组件子类对象,并释放每次请求进入时动态分配的内存。这种方法最终会为每个请求创建对象,并且可能会影响性能(分配& free) 并可能导致内存碎片。

  2. 在请求对象中静态创建组件子类对象,并将它们的引用指向组件数组。我不确定这是否是个好主意,但通过重用相同的对象解决了问题。而且我不确定如何以简单而优雅的方式实现这一目标?任何建议都会有所帮助。

谢谢

最佳答案

先做最简单的方案。

选项 1 可能会影响性能。这是一个很大的可能。如果我是你,我会使用这种方法,因为它更简单。

如果您遇到性能问题,并且如果您可以证明是分配和释放导致了问题,那么您才应该考虑优化解决方案。

您最不想要的就是不必要的复杂代码。

关于C++重用对象以使用抽象基类实现多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24375867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com