2013-04-03 33 views
1

我有一個類(或函數)需要一個對象的集合,比如點,我需要幾種不同的方法來創建它們。此外,我需要測試帶它們的類,所以我想過爲「點集合創建者」類創建一個接口或基類。在C++中返回一個集合的接口

我知道在C++中接受對象集合到函數中的習慣用法是傳遞兩個模板化的迭代器。類似這樣的:

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

但是如何返回一個集合?如何聲明一組返回集合的類,以便將它傳遞給這樣的函數?

我應該只是返回集合(矢量或其他),然後讓它的開始和結束迭代器通過它們?或者我應該模仿容器的界面? (例如,這可能稍後會用於測試具體類,並使用Google Mock的ASSERT_THAT和ElementsAre)。


UPDATE。我添加了一些信息

正如我所說,我需要處理一些觀點。爲簡單起見,假設我需要採取一系列的點,做對他們的一些計算,並返回一個值(例如,中值連續點之間的距離):

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剛剛返回矢量,它應該提供開始和結束功能,就好像它是一個容器,沒有這些選項......?也許我做錯了所有的事情?

+0

你能舉一個例子說明如何使用整個接口,從創建容器到將其傳遞給另一個函數? –

+0

返回帶有函數'begin'和'end'的迭代器(就像所有的標準容器一樣) – borisbn

+0

你想用doSomething函數裏的那個集合來做什麼?如果你想要例如填充它(使用push_back方法等),那麼模板不是很好,所以你需要一些通用的接口,這將被所有的集合繼承,所以你可以使用多態並在不同的對象上調用相同的方法(方法插入集合) – Krab

回答

1

這取決於。有兩種情況:

  • 您正在構建新容器。這有點像 一種工廠方法;在這種情況下,您返回容器。

  • 您正在返回對現有容器的引用。在 這種情況下,您可以返回容器的引用, 或提供兩個函數,一個返回迭代器的begin ,另一個返回迭代器的end

從你所描述的,你是在第一種情況。你真的 沒有其他選擇:如果你想創建一個對象,它必須 住在某個地方,它不能生活在創建它的功能 它。

有人可能會爭辯說,庫容器的設計是 ,這樣你就不應該使用工廠函數。(工廠 函數主要用於動態分配,多態的 對象。您幾乎不希望動態分配容器 ,並且標準容器不是多形的。) 如果您有用於初始化容器的序列,你可以把它當作第二種情況下,上面寫 財產以後這樣的:

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

換句話說,離開實際容器的創建 客戶端,只是爲他提供初始化 序列。

+0

爲了完整性,還可以選擇將引用傳遞給現有的容器。 – PlasmaHH