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

时间:2013-04-03 10:14:36

标签: c++ stl containers

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

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

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

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

我应该只返回集合(向量或其他),然后获取它的开始和结束迭代器来传递它们吗?或者我应该模仿容器的界面? (这可能会在以后用于测试具体类,并使用Google Mock的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{ /*...*/ };
//...

PointGenerator应该只返回一个向量,它应该提供开始和结束函数,就像它是一个容器一样,没有这些选项......?也许我做错了?

1 个答案:

答案 0 :(得分:1)

这取决于。有两种情况:

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

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

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

有人可能会说库容器的设计是 这样你就不应该使用工厂功能了。 (厂 函数主要用于动态分配,多态 对象。你几乎不想分配一个容器 动态地,标准容器不是多态的。) 如果你有序列应该用于初始化 容器,你可以把它作为第二种情况,上面和写 像是这样的事情:

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

换句话说,保留实际容器的创建 客户端,只是为他提供初始化 序列