我有两个类,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 ++很新,而且我已经在这个问题上工作了两天而没有任何运气。我怎样才能克服这个问题?我应该有另一种设计策略吗?我将不胜感激任何有助于我解决这个问题的意见或建议。
答案 0 :(得分: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) {}
};