类中可选常量引用的初始化

Initialization of an optional constant reference in a class

本文关键字:引用 初始化 常量      更新时间:2023-10-16

我有两个类,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++ 相当陌生,我已经在这个问题上工作了两天,没有任何运气。我怎样才能克服这个问题?我应该有另一种设计策略吗?我将不胜感激任何有助于我解决这个问题的意见或建议。

引用必须初始化,没有例外。

但是,在您的情况下,您可以通过手头有一个空向量来处理这些情况来解决此问题:

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) {}
};