用于在C++中返回集合的接口
Interface for returning a collection in C++
我有一个类(或函数(,它接受一组对象,比如点,我需要几种不同的方法来创建它们。此外,我需要测试使用它们的类,所以我考虑为"点集合创建者"类创建一个接口或基类。
我知道在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() );
换句话说,将实际容器的创建留给客户端,并为其提供初始化序列
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 如何将ampl中的集合表示为c++中的向量
- 检查值是否在集合p1和p2中,但不在p3中
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 集合上的输出迭代器:assign和increment迭代器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 实现一个在集合上迭代的模板函数
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 尝试使用集合函数时出现分段错误
- Visual C++GC接口如何启用它以及要包含哪个库
- 互斥指针的集合
- Windows.h与GLFW.h的接口
- 继承Java集合接口(Set、Map、List等)的C++等价物是什么?或者扩展AbstractCollection
- 具有不同接口的对象的集合
- 具有扩展接口的派生类的集合.如何在没有动态强制转换的情况下访问派生接口
- 用于在C++中返回集合的接口
- 接口的集合相互依赖
- 如何为集合提供带有迭代器的 const 接口