gpt4 book ai didi

c++ - C++返回集合的接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:04 25 4
gpt4 key购买 nike

我有一个类(或函数),它接受对象的集合,比如点,我需要几种不同的方法来创建它们。此外,我需要测试接受它们的类,所以我想到了为“点集合创建者”类创建一个接口(interface)或基类。

我知道在 C++ 中将对象集合接受到函数中的惯用方法是传递两个模板化迭代器。像这样:

template <typename Iterator>
double doSomething(Iterator first, Iterator last);

但是如何返回一个集合呢?如何声明一组返回集合的类,以便我可以将它传递给这样的函数?

我是否应该只返回集合( vector 或其他),然后获取它的开始和结束迭代器来传递它们?或者我应该模仿容器的界面吗? (这在以后测试具体类和使用 Google Mock 的 ASSERT_THAT 和 ElementsAre 时可能很有用,例如)。


更新。我要添加更多信息

正如我所说,我需要处理一些点。为简单起见,假设我需要获取一系列点,对它们进行一些计算,然后返回一个值(例如,连续点之间的平均距离):

double ProcessPoints(/*Take points somehow*/);

或者也许:

class PointProcessor
{
public:
PointProcessor(/*Take points somehow*/);
double Run();
//...
}

现在,我需要几种方法来创建一系列点,例如一系列 N 个随机点,一系列线段的交点,用于测试的假...所以我认为它们应该有一个通用的接口(interface)或基类:

class PointsGenerator { /*...*/ };

class RandomPoints : public PointsGenerator{ /*...*/ };
class IntersectionsBetweenSegments : public PointsGenerator{ /*...*/ };
class FakePointsGenerator : public PointsGenerator{ /*...*/ };
//...

那么 PointsGenerator 是否应该只返回一个 vector ,它是否应该像容器一样提供开始和结束函数,这些选项都不是......?也许我做错了?

最佳答案

这取决于。有两种情况:

  • 您正在构建一个新容器。这有点像工厂方法;在这种情况下,您返回容器。

  • 您正在返回对现有容器的引用。在在这种情况下,您可以返回对容器的引用,或者提供两个函数,一个返回 begin迭代器,另一个返回 end 迭代器。

根据你的描述,你属于第一种情况。你真的别无选择:如果你想创建一个对象,它必须住在某个地方,它不能住在创造的功能中它。

有人可能会争辩说图书馆容器的设计是这样你就不应该使用工厂函数。 (工厂函数主要是动态分配的,多态的对象。你几乎不想分配一个容器动态的,标准容器不是多态的。)如果你有应该用来初始化的序列容器,你可以把它当作上面的第二种情况,写像这样的东西:

std::vector<Whatever> v( beginWhatever(), endWhatever() );

换句话说,将实际容器的创建留给客户端,只需为其提供初始化顺序。

关于c++ - C++返回集合的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15784603/

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