1

Java를 매우 오랫동안 사용 해왔고 C++ 프로그래밍 스타일에 익숙해 지는데 문제가 있습니다. C++에서 인스턴스 변수의 알고리즘 초기화

우리는 다음과 같은 시나리오를 관리 할 수있는 방법 :

  • 인스턴스 변수가 기본 생성자를 사용하여 생성 할 수없는 개체입니다. 자바 생성자에서 매개 변수는 상위 수준의 클래스 생성자에서 결정될 수 있습니다.

  • 인스턴스 변수는 참조 유형이므로 생성자에서 간단한 알고리즘 (조건, 계산, ...)을 실행 한 다음 해당 참조에 객체를 만들고 할당해야합니다.

아마도 생성자 초기화 목록이 아닌 다른 위치에서 인스턴스 변수를 초기화해야하는 유사한 시나리오가있을 수 있습니다. 나는 GCC가 그렇게 할 수 있다고 생각하지만 (경고 발행), VC++는 허용하지 않는 것 같다.

나는 이들 중 대부분을 포인터를 사용하여 수행 할 수 있다고 생각하지만 가능한 한 포인터를 피하려고 노력하고있다 (런타임 크래시를 최소화하고 또한 문제를 디버깅하기가 어렵다).

+0

나는 첫 번째 요점을 잘 모르겠다. 기본이 아닌 생성자, 즉 매개 변수가있는 생성자를 호출 할 수 없습니까? – juanchopanza

+0

이니셜 라이저 목록에서만 할 수 있습니다. Java에서 수행되는 방식과 다릅니다. –

+0

@juanchopanza : 예.이 경우 매개 변수는 코드를 실행 한 후에 식별됩니다. 상위 수준 클래스를 인스턴스화 할 때는 사용할 수 없습니다. – wmac

답변

2
  • 인스턴스 변수는 기본 생성자를 사용하여 생성 할 수없는 개체입니다. 자바 생성자에서 매개 변수는 상위 수준의 클래스 생성자에서 결정될 수 있습니다.
class A { 
public: 
    A(int n); 
} 

class B { 
public: 
    B(int n) : a1(n), a2(n+1) {} 
private: 
    A a1, a2; 
} 
  • 인스턴스 변수는 참조 형식이고 우리는 생성자 (... 조건 계산) 간단한 알고리즘을 실행하고 만들고 해당에 객체를 할당 할 필요 참고.
static int n = 1; 
static int m = 2; 
class A { 
public: 
    A(bool useN) : ref(useN ? n : m) {} 
private: 
    int &ref; 
} 

당신은 정적 도우미 기능에서 더 복잡한 계산을 숨길 수 물론, 이니셜 라이저 목록에 ref(f(parameters)) 데.

개체를 먼저 만든 다음 참조에 할당해야하는 경우 해당 개체가 주로 어디에 있습니까? 어쨌든 참고 문헌은 단지 누군가가 "저 위에 있어요"라고 말하고있는 누군가입니다. 외부 객체가 실제로이 객체를 소유 한 객체라면 참조를 원하지 않습니다. 개체 또는 스마트 포인터가 필요합니다.

Java 참조는 아마도 일상적인 사용에 강력히 권장되는 표준 라이브러리의 스마트 포인터 중 하나 인 C++ 11의 std::shared_ptr에 가장 근접 할 것입니다. 이러한 유형의 설정에서는 오버 헤드가 조금 더 적지 만 제한 사항이있는 std::uniqe_ptr을 고려할 수도 있습니다. 당신이 적절한 복사 생성자를 생성해야한다는 사실이 문제의 취지에 상관없이 - shared_ptr과 결합 된 기본 생성자는 사용자가 원하는 동작이 아닌 경우가 종종 있습니다.

하위 호환성을위한 언어 인 std::auto_ptr의 상태를 유지하십시오. 많은 상황에서 올바르게 사용하는 것은 까다로운 작업입니다.

+1

조금이라도 다시 말해 보겠습니다 ... –