2011-12-17 2 views
19

기본 생성자 또는 할당 연산자가없는 클래스가 있으므로 다른 함수의 결과에 따라 if/else 문에서 선언되고 초기화됩니다. 그러나 두 조건의 경로가 인스턴스를 만들지 만 나중에 범위를 벗어난다고합니다.if 문의 변수 범위

은 (단지 점을 설명하기 위해 int으로 수행) 다음과 같은 예를 생각해

#include <iostream> 

int main() 
{ 
    if(1) { 
    int i = 5; 
    } else { 
    int i = 0; 
    } 

    std::cout << i << std::endl; 
    return 0; 
} 

변수는 조건의 끝에서 범위를 벗어난 조건 이동에 선언합니까? 기본 생성자가없는 상황을 처리하는 올바른 방법은 무엇입니까? 그러나 생성자에 대한 인수는 특정 조건에 따라 다릅니다.

주어진 답변에 비추어 편집

는 상황이 그래서 아마 접근 방식을 변경해야 더 복잡하다. A에서 파생 된 추상 기본 클래스 A와 두 클래스 B 및 C가 있습니다. 어떻게 이런 식으로 표현합니까?

if(condition) { 
    B obj(args); 
} else { 
    C obj(args); 
} 

변경 방법은 무엇입니까? A가 추상이므로 A* obj을 선언하고 new으로 적절한 유형을 만들 수는 없습니다.

+0

가상 또는 정적 상속 있습니까? – Dani

+0

가상입니다. 'class A'는 가상 함수를 가지고 있습니다. C++은 강한 편이 아니며 Fortran에서 주로 작동합니다. – tpg2114

+0

실제로 추상 클래스에 대한 포인터를 선언 할 수 있습니다. 저는 제 대답을 편집했습니다. –

답변

16

"조건부에서 선언 된 Do 변수는 조건부 끝에서 범위를 벗어납니다."

- 지역 변수의 범위는 둘러싸는 괄호 내에 : 귀하의 경우

{ 
    int x; //scope begins 

    //... 
}//scope ends 
//x is not available here 

을, 당신이 class A을 말한다.

A a = condition ? A(1) : A(2,3); 

당신은 힙의 인스턴스를 만드는 경우 : 다른 생성자의 프로토 타입을 사용하는 경우

A a(condition ? 1 : 2); 

또는 :

당신은 포인터를 처리하지 않는 경우

A* instance = NULL; 
if (condition = true) 
{ 
    instance = new A(1); 
} 
else 
{ 
    instance = new A(2); 
} 

또는 세 가지 연산자를 사용할 수 있습니다.

//if condition is true, call A(1), otherwise A(2) 
A* instance = new A(condition ? 1 : 2); 

편집 :

예는 수 :

A* x = NULL; //pointer to abstract class - it works 
if (condition) 
    x = new B(); 
else 
    x = new C(); 

편집 :

공장 패턴이 무엇인지 당신이 찾고있는 것 같다 (그것을 보면) :

class A; //abstract 
class B : public A; 
class C : public A; 

class AFactory 
{ 
public: 
    A* create(int x) 
    { 
     if (x == 0) 
      return new B; 
     if (x == 1) 
      return new C; 
     return NULL; 
    } 
}; 
+0

이 경우 메모리가 재 할당됩니까 ?? 변수 범위가 {} 괄호로 둘러싸인 뒤에 끝납니다. – kaushalpranav

4

변수 조건부로 선언하면 범위 끝에서 범위를 벗어납니다 조건부?

예.

더 기본 생성자하지만 생성자의 인수가없는 상황을 처리하는 올바른 방법은 무엇입니까

는 특정 조건문에 따라?

복사 한 값을 반환하는 함수를 작성하십시오.

T foo() 
{ 
    if(condition) 
     return T(x); 
    return T(y); 
} 

void bar() 
{ 
    T i(foo()); 
} 

편집 : A는 추상적이기 때문에, 난 그냥 A * OBJ를 선언하고 새와 적절한 유형을 만들 수 없습니다

.

무엇을 의미합니까? 이것이 정확히 동적 타이핑이 작동하는 방식입니다. 나는 원시 포인터를 사용하지 않을 것이 아니라 unique_ptr을 사용할 것입니다. 등 조건, 루프에 선언 된 경우

std::unique_ptr<A> obj; 
if(condition) { 
    obj = std::unique_ptr<A>(new B(args)); 
} else { 
    obj = std::unique_ptr<A>(new C(args)); 
} 
+0

이 답변은 첫 번째 답변과 모순됩니까? (조건부에서 선언 된 변수가 조건부의 끝에서 범위를 벗어날 지 여부) – LazerSharks

+1

@Gnuey : 아니요. 나는 Luchian이 "아니오"라고 대답하는 질문에 대해 확실하지 않습니다. 어쩌면 그는 단지 질문을 읽던 시간과 대답을 쓰던 시간 사이에 혼란스러워 할 것입니다. 그러나 그 뒤에 오는 주석이 달린 코드 스 니펫과 함께 완전한 진술은 분명히 내 대답에 동의합니다. –

0

네, 그것은 범위를 벗어난 것입니다 윌 조건에 따라 변수 변화의 종류?

+0

두 가지 경우가 있습니다. 때로는 조건부에 관계없이 동일한 유형이며 때로는 조건부에 따라 다른 유형입니다. 두 가지 상황에서 접근법이 어떻게 바뀌 었습니까? – tpg2114

+0

@ tpg2114 내 대답을 읽으셨습니까? –

+0

있습니다. 나는 그것이 첫 번째 사건 (같은 유형)을 다루는 방법을 본다. 조건부를 기반으로 다른 유형이 선언 될 가능성을 어떻게 해결합니까? – tpg2114

0

귀하의 대안이 될 것이다 포인터 :

MyObject *obj; 
if(cond1) 
{ 
    obj = new MyObject(1, 2, 3); 
} 
else 
{ 
    obj = new MyObject(4, 5); 
} 

당신이 그것으로 수행, 또는 스마트 포인터를 사용하는 경우 삭제해야합니다.

+0

당신은 ** 포인터를 사용할 수 있지만 그렇게 할 필요는 없습니다. –