1

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

我知道在 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{ /*...*/ };
//...

那么 PointsGenerator 是否应该只返回一个向量,它是否应该像容器一样提供开始和结束功能,这些选项都没有......?也许我做错了?

4

1 回答 1

1

这取决于。有两种情况:

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

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

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

有人可能会争辩说,库容器的设计使您不应该使用工厂函数。(工厂函数主要用于动态分配的多态对象。你几乎从不想动态分配容器,标准容器不是多态的。)如果你有应该用来初始化容器的序列,你可以把它当作上面的第二种情况,并编写如下内容:

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

换句话说,将实际容器的创建留给客户端,只需向他提供初始化序列即可。

于 2013-04-03T10:26:19.793 回答