我有兩個類,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::optional
或std::experimental::optional
,但我無法使它工作。
我對C++相當陌生,我一直在這個問題上工作了兩天,沒有任何運氣。我怎樣才能克服這個問題?我應該有另一種設計策略嗎?我將不勝感激任何意見或建議,這將有助於我解決這個問題。
你正在做這個太複雜了。首先,'B :: vec'應該是'B :: func_B'的參數(與'A'一致)。然後'a_ptrs'不能作爲引用,並且你在函數參數類型中缺少一些'const'限定符。 – LogicStuff
你爲什麼有參考成員? –
@LogicStuff,是的,你說得對,'B :: vec'應該是'B :: func_B'的一個參數。爲什麼我不能把'a_ptrs'作爲參考?有什麼選擇?我試圖不要有任何'A類'副本。 – Pafnuty