用于在C++中返回集合的接口

Interface for returning a collection in C++

本文关键字:集合 接口 返回 C++ 用于      更新时间:2023-10-16

我有一个类(或函数(,它接受一组对象,比如点,我需要几种不同的方法来创建它们。此外,我需要测试使用它们的类,所以我考虑为"点集合创建者"类创建一个接口或基类。

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

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

但归还藏品怎么样?如何声明一组返回集合的类,以便将其传递给这样的函数?

我应该只返回集合(向量或其他什么(,然后让它的开始和结束迭代器来传递它们吗?还是应该模仿容器的界面?(例如,这在以后测试具体类和将GoogleMock的ASSERT_THAT与ElementsAre一起使用时可能很有用(。


更新。我正在添加更多信息

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

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

或者:

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

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

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

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

这取决于情况。有两种情况:

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

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

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

有人可能会说,图书馆容器的设计这样就不应该使用工厂函数。(工厂函数主要用于动态分配、多态对象。您几乎从不想分配容器动态的,并且标准容器不是多态的。(如果您有应该用于初始化容器,您可以将其视为上面的第二种情况,然后编写类似于:

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

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