두 개의 클래스 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++을 처음 접했고,이 문제에 대해 이틀 동안 행운이 없었습니다. 이 문제를 어떻게 극복 할 수 있습니까? 또 다른 디자인 전략이 있어야합니까? 이 문제를 해결하는 데 도움이되는 의견이나 제안을 보내 주시면 감사하겠습니다.
당신이 너무 복잡하게 만들고있어. 첫째,'B :: vec'는'B :: func_B' ('A'와의 일관성)에 대한 인자입니다. 그런 다음'a_ptrs'는 참조가 될 수 없으며 함수 매개 변수 유형에'const' 한정자가 없습니다. – LogicStuff
참조 회원이있는 이유는 무엇입니까? –
@LogicStuff 네, 맞습니다. B :: vec는 B :: func_B에 대한 인수 여야합니다. 왜 내가'a_ptrs'를 참조로 사용할 수 없습니까? 대안은 무엇입니까? 나는'class A'의 복사본이 없도록 노력하고 있습니다. – Pafnuty