2009-09-14 5 views
55

내가 C++ 클래스 Foo와 Foo 포인터가 전달되는 생성자로 생성해야하는 클래스 Bar가 있고이 포인터는 Bar 인스턴스 수명주기에서 변경되지 않는 상태로 남겨두기위한 것입니다. 그것을하는 올바른 방법은 무엇입니까?생성자에서 const 필드를 초기화하는 방법은 무엇입니까?

는 사실, 나는 아래의 코드처럼 쓸 수 있다고 생각하지만 컴파일되지 않습니다 ..

class Foo; 

class Bar { 
public: 
    Foo * const foo; 
    Bar(Foo* foo) { 
     this->foo = foo; 
    } 
}; 

class Foo { 
public: 
    int a; 
}; 

어떤 제안을 환영합니다.

답변

64

당신은 초기화 목록에서 작업을 수행해야합니다

Bar(Foo* _foo) : foo(_foo) { 
} 

(I 혼란을 방지하기 위해 유입되는 변수의 이름을 변경합니다.)

+3

+1 예를 들어 : 보조 노트로

Bar(Foo* foo) : foo(foo) { } 

, 변경하지 않을 경우 어떤 foo는 점에서, 참조로의 통과 밑줄로 시작하기 * 공식적으로 * 예약 됨 ;-) –

+1

뒤에 대문자가 오는 경우에만. – GManNickG

+1

이거나 네임 스페이스 범위에 있습니다! 또는 뒤에 밑줄이옵니다. 그래서 그래,이 경우에는 기술적으로 합법적인데, 나는 그들이 소유하고있는 척하면서 사용하지 않는 것이 더 쉽다고 말하고 싶습니다. :) – jalf

2

가 참조 사용

Foo& foo; 
Bar(Foo& f) : foo(f) { } 

당신을 foo을 쉽게 참조 할 수 있습니다. Bar :

foo.doSomething(); 
+1

유일한 답변 인 경우이를 달성하는 유일한 방법은 참조를 사용하는 것이 잘못 생각할 수 있으므로 "부정적인"투표를하는 것입니다. 대신에 다른 답변이 보여주는 것처럼 트릭이 이니셜 라이저 목록입니다. – puccio

+0

IMHO, 포인터가 초기화 된 후에 전혀 변경되지 않아야하기 때문에이 경우 훨씬 더 우아한 참조가 가능합니다. – AraK

+1

하지만 포인터를 초기화하는 방법이 문제였습니다. –

0

시도 : const를 회원들과 다른 특별한 경우 (예 : 부모 클래스) 초기화는 Bar(Foo* xfoo) : foo(xfoo) {}

12

부모 초기화, 이니셜 라이저 목록 유사

class Foo { 
private: 
    const int data; 
public: 
    Foo(int x) : data(x) {} 
}; 

또는에서 수행 할 수 있습니다

class Foo { 
private: 
    int data; 
public: 
    Foo(int x) : data(x) {} 
}; 

class Bar : Foo { 
public: 
    Bar(int x) : Foo(x) {} 
}; 
5

이니셜 라이저 목록에서 foo를 초기화해야합니다.

class Bar { 
    Foo* const foo; 
    public: 
    Bar(Foo* f) : foo(f) {...} 
}; 
16

저는 이니셜 라이저에서해야한다고 생각합니다. 나는 최근 여기에 배운 변수 있다는했습니다 있지만,

Foo& foo; 

Bar(Foo& foo) : foo(foo) { 
} 
+2

+1 : 원하는 곳에 포인터를 사용하여 참조를 사용하십시오. –