2016-09-16 2 views
0

우선, 나는 이런 질문에 대해 말하지 않는다. (1, 2). 나는 이미 생성자를 가지고 있고 정의에 의해서가 아닌 값으로 중첩 된 클래스에 대해 이야기하고 있습니다.중첩 클래스의 생성자를 호출하는 방법

는 현재 내가 작동이 방법을 가지고 있지만, new을 사용하고 IMO 추악한 :

class A { 
private: 
    int value; 

public: 
    A(int _value); 
}; 

class B { 
private: 
    A *a; 
public: 
    B(int _value); 
}; 

B의 생성자 :

B::B(int _value) 
{ 
    a = new A(_value); 
} 

내가 A aA *a;을 변경한다면, A의 생성자가 같은 방식으로 호출되도록 B을 어떻게 만들 수 있습니까?

나는 시도했다 : A에 대한 몇 가지 명시 적 void A::init(_value) (필요 추가 생성자를 사용하여 new

  • 와 포인터를 사용

    • : 그것은없이 가능하지 않는 것

      B::B(int _value) 
      { 
          a = A(_value); // no matching function for call to ‘A::A()’ 
          a = A::A(_value); // cannot call constructor ‘A::A’ directly 
          a(_value);  // no match for call to ‘(A) (int&)’ 
          a.A(_value);  // invalid use of `A::A` 
      } 
      

      인수 없음)

    • 클래스 A를 확장 (특정 개인 구성원을 protected 및 w) 원하지 않는 방식으로 memcpy() (A temp(_value); memcpy(&a, &temp, sizeof (A));)

  • 의심 사용 그들의 "네임 스페이스"메쉬 울드은 상기 방법에 의존하지 않고이 가능한가?

  • +0

    참조 멤버와 생성자 이니셜 라이저 목록을 사용하십시오. –

    +0

    참조가이 경우 값보다 유리합니까? 두 가지가 모두'B '의 생성시 생성되는 것처럼 보이며, 둘 다 같은 사용법 구문과 의미를가집니다. –

    +0

    아니요, 아마도 귀하의 질문에 잘못이 있습니다. –

    답변

    1

    초기화 목록을 사용합니다.

    e.e. B 생성자는 다음과 같습니다.

    class B { 
        ... 
    
        A a; 
    }; 
    
    B::B(int _value) : a(_value) { 
        ... 
    } 
    
    +0

    'a'는 실제로 포인터입니다! –

    +1

    @ πάνταῥε OP 정확히 OP가 제거하려고하는 것은 다음 중 어느 것입니까? –

    +0

    @ πάνταῥεῖ - 그는 포인터에서 바꾸고 싶다고 말했습니다. –

    관련 문제