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

时间:2017-09-03 21:31:57

标签: c++ constructor shared-ptr boost-optional

我有两个类,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 个答案:

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