2017-09-03 1 views
0

두 개의 클래스 A와 B가 있습니다. 클래스 A는 주어진 벡터에서 변형을 수행하는 변환 (행렬)입니다.클래스의 선택적 상수 참조 초기화

class A{ 
public: 
    ... 
    A(...){}; 
    ... 
    void func_A(std::vector<double>& vec){ 
     /* Transform vector vec */ 
    } 
}; 

클래스 B에는 두 개의 멤버가 있습니다. std::vector<double> &vec은 벡터의 참조이며, 다른 변환의 표현 인 클래스 A의 공유 포인터를 포함하는 다른 벡터의 상수 참조는 const std::vector<std::shared_ptr<A> > &a_ptrs이다. a_ptrs은 0 개, 하나 또는 여러 개의 변환을 포함 할 수 있습니다. 클래스 B의 작업 중 하나는 벡터 (vec)에 대한 변환 (있는 경우)을 적용하는 것입니다. const std::vector<std::shared_ptr<A> > &a_ptrs가 B의 생성자에 인수로 전달하면이를 위해

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의 생성자를 오버로드 한 모든 것이 괜찮습니다. 하지만 제 문제는 단지 하나의 변환이 사용 가능한 경우, 즉 각각 a_ptrs이 비어 있거나 하나의 요소 만있는 경우에이 상수 참조를 초기화하는 방법을 알지 못한다는 것입니다.

a_ptrs에 요소가 하나만있는 경우 const std::shared_ptr<A> &aptr을 전달하고 그에 따라 a_ptrs을 초기화 할 수 있기를 바랍니다.

또한 B 클래스의 클래스 A에 대한 공유 포인터 복사본을 만들고 싶지 않습니다. 공유 포인터에 대한 상수 참조도 갖고 싶습니다.

인터넷에서 발견 한 바를 토대로 boost::optional 또는 std::experimental::optional을 사용할 가능성이 있지만 제대로 작동하지 않을 수 있습니다.

저는 C++을 처음 접했고,이 문제에 대해 이틀 동안 행운이 없었습니다. 이 문제를 어떻게 극복 할 수 있습니까? 또 다른 디자인 전략이 있어야합니까? 이 문제를 해결하는 데 도움이되는 의견이나 제안을 보내 주시면 감사하겠습니다.

+1

당신이 너무 복잡하게 만들고있어. 첫째,'B :: vec'는'B :: func_B' ('A'와의 일관성)에 대한 인자입니다. 그런 다음'a_ptrs'는 참조가 될 수 없으며 함수 매개 변수 유형에'const' 한정자가 없습니다. – LogicStuff

+0

참조 회원이있는 이유는 무엇입니까? –

+0

@LogicStuff 네, 맞습니다. B :: vec는 B :: func_B에 대한 인수 여야합니다. 왜 내가'a_ptrs'를 참조로 사용할 수 없습니까? 대안은 무엇입니까? 나는'class A'의 복사본이 없도록 노력하고 있습니다. – Pafnuty

답변

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

고맙습니다. @ 프랭크,이 제안입니다. 두 번째 생성자는 어떻습니까? – Pafnuty