类中可选常量引用的初始化
Initialization of an optional constant reference in a class
我有两个类,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++ 相当陌生,我已经在这个问题上工作了两天,没有任何运气。我怎样才能克服这个问题?我应该有另一种设计策略吗?我将不胜感激任何有助于我解决这个问题的意见或建议。
引用必须初始化,没有例外。
但是,在您的情况下,您可以通过手头有一个空向量来处理这些情况来解决此问题:
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) {}
};
相关文章:
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖