2011-03-14 3 views
1

죄송합니다. 이전에 질문을 받았다면 아무 것도 찾을 수 없습니다. 나는 이것을 어떻게 찾을 지 잘 모르겠다. 나는이 Aa 포인터를 만들고 다음 B의 생성자 내부 a = new A(3, 4);을하고 해결하기 위해 생각할 수있는다른 클래스의 비공개 멤버로서 객체 선언/초기화 문제가 발생했습니다.

class A { 
    private: 
     int x; 
     int y; 
    public: 
     A(int, int); 
} 

class B { 
    private: 
     A a(3, 4); // Doesn't compile because of this line 
    public: 
     B(); 
} 

유일한 방법 :

나는 이런 식으로 뭔가가있다. 하지만 a은 포인터가되고 싶지 않습니다.

이 문제를 해결하는 올바른 방법은 무엇입니까? 넓은 의미에서

+0

모든 정의 형 단순 POD 같은 필수 유형은? 그렇다면 비 형식 템플릿 매개 변수로 만들 수 있습니다. 예. 'A <3, 4> a;'. 이 접근법에 제약이 있습니다. 그 중 하나는 컴파일시에 init 값을 알아야한다는 것입니다. – greatwolf

답변

2

당신 태그 B의 생성자 ". 대신에 :

B::B() { 
    ... 
} 

이 작업을 수행 :

B::B() : a(3, 4) { 
    ... 
} 

또는

생성자는 헤더에 정의되어있는 경우 :

class B { 
    private: 
     A a; 
    public: 
     B() : a(3, 4) { 
      ... 
     } 
}; 
+0

다른 방법이 없습니까? 초기화 할 수십 가지 변수가 있다면 어떻게 될까요? 코드는 정말 이상하게 보일 것입니다. –

+2

@ Nazgulled : C++은 익숙하지 않은 이상 이상하게 보입니다. 수십 개의 데이터 멤버와 하나 이상의 생성자가있을 때까지는 실제로 문제가되지 않습니다. –

+1

@ Nazgulled : C++이 이상하게 보입니다. 그것은 언어의 일부입니다. * 극복하십시오. * 당신이 정말로 구문을 싫어하고'class A'가 디폴트 생성자를 가지고 있다면 그것은 자동적으로 사용될 것입니다; 생성자에서'a' ('a = A (3, 4);')에 새로운 값을 대입 할 수는 있지만 비효율적입니다. 가능한 경우 최적화 목록을 사용하는 것이 더 효율적으로 최적화되고 작고 빠른 코드를 생성하는 것이 더 좋습니다. –

2
class B { 
    private: 
     A a; 
    public: 
     B() : a(3,4) {} 
}; 

은 용액 reading a book about it C++로 학습하는 것이다. 그렇습니다.하지만 자습서의 핵심은 현명한 순서로 개념을 소개하고, 데이터 멤버에 대해 알려주면 동시에 초기화하는 방법을 알려줍니다.

0

당신이 원하는 것은 바는 인수 3과 4로 초기화 할 경우, 당신이 할 그 B의 생성자, 예를 들면, "멤버 초기화리스트

class B { 
    private: 
     A a; 
    public: 
     B(): a(3, 4) {} 
} 
관련 문제