我有一个类(或函数)来获取对象的集合,比如点,我需要几种不同的方法来创建它们。此外,我需要测试带它们的类,所以我想到为“点集合创建者”类创建一个接口或基类。
我知道在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应该只返回一个向量,它应该提供开始和结束函数,就像它是一个容器一样,没有这些选项......?也许我做错了?
答案 0 :(得分:1)
这取决于。有两种情况:
您正在构建一个新容器。这有点像 工厂方法;在这种情况下,您将返回容器。
您将返回对现有容器的引用。在
在这种情况下,您可以返回对容器的引用,
或提供两个函数,一个返回begin
迭代器,另一个返回end
迭代器。
根据您的描述,您处于第一种情况。你真的 别无选择:如果你想创建一个对象,它必须 生活在某个地方,它不能生活在创造的功能中 它。
有人可能会说库容器的设计是 这样你就不应该使用工厂功能了。 (厂 函数主要用于动态分配,多态 对象。你几乎不想分配一个容器 动态地,标准容器不是多态的。) 如果你有序列应该用于初始化 容器,你可以把它作为第二种情况,上面和写 像是这样的事情:
std::vector<Whatever> v( beginWhatever(), endWhatever() );
换句话说,保留实际容器的创建 客户端,只是为他提供初始化 序列