기본 생성자가 삭제 된 클래스를 생각해보십시오. (실제 클래스는 훨씬 복잡하고 기본 생성자는 삭제 된 기본 생성자가있는 멤버로 인해 암시 적으로 삭제됩니다. 일부 입력 값에 따라 생성자 중 하나를 사용하여 클래스를 인스턴스화 한 다음 "많은 일"을 수행하고 싶습니다. 다음 코드는 코드 주석에 명시된 이유로이 작업을 수행 할 수없는 두 가지 방법을 보여 주지만 내가 성취하고자하는 것에 대한 아이디어를 제공합니다. 이 작업을 수행하는삭제 된 기본 생성자가있는 클래스를 조건부로 인스턴스화
#include <vector>
class A {
bool m_with_v;
int m_i;
std::vector<double> m_v;
public:
A() = delete;
A(int i) : m_i(i), m_with_v(false) {}
A(int i, std::vector<double> v) : m_i(i), m_v(v), m_with_v(true) {}
auto do_stuff() { /* do stuff depending on m_with_v */ };
};
int main(int argc, char* argv[])
{
bool yes_no;
/* Obtain a value for yes_no from argv */
A a; // the default constructor of "A" cannot be referenced -- it is a deleted function
if (yes_no)
a = A(1);
else {
std::vector<double> v{ 1,2,3 };
a = A(1, v);
}
a.do_stuff();
// do a bunch more things
if (yes_no)
A b(1);
else {
std::vector<double> v{ 1,2,3 };
A b(1, v);
}
b.do_stuff(); // identifier "b" is undefined, i.e. it's gone out of scope
// do a bunch more things
}
한 가지 확실한 방법은 if
블록의 각 부분 내부의 "사물의 무리"를 이동하는 것입니다,하지만 그건 내가 피하고 싶은 중복 코드를 많이,이 발생할 것입니다.
또 다른 확실한 방법은 "여러 가지 작업"을 수행하는 함수를 만들고 if
블록의 각 부분에서 호출하는 것입니다. 그러나 특정 양의 리팩토링이 필요하며 함수 호출이 있으면 변수에 전달해야 할 많은 수의 변수가 있습니다.
내 질문은 : 조건부로 클래스를 인스턴스화하고 주변 범위에서 사용할 수있는 방법이 있습니까?
juanchopanza의 솔루션이 좀 더 간단하게 내 질문에 대답하는 동안이 솔루션을 벡터' v'는 자연스럽게 생성되지 않으며 생성자의 선택에 대해서만 생성되어야하며 주변 범위를 오염시키지 않습니다. –