2017-09-03 33 views
0

我有兩個類,A和B.A類是一個變換(矩陣),對給定的向量執行變換。在類中初始化一個可選的常量引用

class A{ 
public: 
    ... 
    A(...){}; 
    ... 
    void func_A(std::vector<double>& vec){ 
     /* Transform vector vec */ 
    } 
}; 

B類有兩個成員; std::vector<double> &vec是矢量的參考,const std::vector<std::shared_ptr<A> > &a_ptrs是另一個包含類A的共享指針的向量的常量引用,表示不同的轉換。 a_ptrs可能包含零個,一個或多個轉換。 B類的一個工作是將這些(如果有的話)變換應用於矢量vec

class B{ 
public: 
    std::vector<double> &vec; 
    const std::vector<std::shared_ptr<A> > &a_ptrs; 

    B(std::vector<double> &vec_ref) : vec(vec_ref){ 
    /* How to initialize a_ptrs if there are no transformations available? 
     That is, there are no shared pointers of class A available.*/ 
    }   

    B(std::vector<double> &vec_ref, 
     const std::shared_ptr<A> &aptr) : vec(vec_ref){ 
     /* How to initialize a_ptrs if there is only one transformation available, and 
     I just decide to pass a const reference to the shared pointer of A? */ 
    } 

    // No issues with this constructor: 
    B(std::vector<double> & vec_ref, 
     const std::vector<std::shared_ptr<A> > &aptr) : vec(vec_ref), a_ptrs(aptr){} 

    void func_B(){ 
     ... 
     // Apply the transforms: 
     for(int i=0; i<a_ptrs.size(); ++i){ 
      a_ptrs[i]->func_A(vec); 
     } 
     .... 
    } 
}; 

爲此,正如你所看到的,我已經超載B類的構造函數時const std::vector<std::shared_ptr<A> > &a_ptrs作爲參數傳遞給B的構造函數,一切都很好。但我的問題是,我根本不知道如何初始化這個常量引用,用於零個或只有一個可用變換的情況,即,a_ptrs分別爲空或只有一個元素。

如果a_ptrs只有一個元素,我希望能夠通過一個const std::shared_ptr<A> &aptr,並以某種方式初始化a_ptrs

我也不想讓B類中的類A的共享指針的任何副本。我也想有一個對共享指針的常量引用。

基於我在網上找到的,有可能使用boost::optionalstd::experimental::optional,但我無法使它工作。

我對C++相當陌生,我一直在這個問題上工作了兩天,沒有任何運氣。我怎樣才能克服這個問題?我應該有另一種設計策略嗎?我將不勝感激任何意見或建議,這將有助於我解決這個問題。

+1

你正在做這個太複雜了。首先,'B :: vec'應該是'B :: func_B'的參數(與'A'一致)。然後'a_ptrs'不能作爲引用,並且你在函數參數類型中缺少一些'const'限定符。 – LogicStuff

+0

你爲什麼有參考成員? –

+0

@LogicStuff,是的,你說得對,'B :: vec'應該是'B :: func_B'的一個參數。爲什麼我不能把'a_ptrs'作爲參考?有什麼選擇?我試圖不要有任何'A類'副本。 – Pafnuty

回答

0

引用必須被初始化,沒有例外。

然而,在您的情況,您可以通過手頭有一個空向量處理這類情況的解決這個問題:

class B { 
    static const std::vector<std::shared_ptr<A> > empty_a; 

    std::vector<double> &vec; 
    const std::vector<std::shared_ptr<A> > &a_ptrs; 
public: 

    B(std::vector<double> &vec_ref) 
    : vec(vec_ref), 
     a_ptrs(empty_a) {} 
}; 
+0

謝謝@Frank對於這個建議。那第二個構造函數呢? – Pafnuty