2011-09-16 4 views
2

다른 객체 안에 객체 참조를 저장하는 방법과 해당 참조를 전용 속성으로 설정하는 방법이 궁금합니다. 예 (의사 코드) : 당신이 볼 수있는 바와 같이클래스에서 참조하는 C++ 객체

class foo 
{ 
    public: 
     int size; 
     foo(int); 
}; 

foo::foo(int s) : size(s) {} 

class bar 
{ 
    public: 
     bar(foo&); 
    private: 
     foo fooreference; 
}; 

bar::bar(foo & reference) 
{ 
    fooreference = reference; 
} 

foo firstclass(1); 
bar secondclass(firstclass); 

, 난 그냥이 바 클래스 내부 foo에의 참조를 저장할 수 있어야합니다. 메소드에 넣고 메소드의 범위 내에서 사용하는 방법을 알고 있지만 여기서는 그것을 개인용 속성으로 설정하려고합니다. 이 일을 어떻게 하죠?

답변

2

클래스 멤버를 정의하고 사용하는 것과 같은 방법입니다.

은 생성자 본문에 사실을 지정하는 대신 _member-initialiser를 사용하여 참조 멤버을 초기화해야합니다. 참조는 초기화되어야하고 나중에 리바운드 될 수 없다는 점을 상기하십시오.

class foo 
{ 
    public: 
     int size; 
     foo(int); 
}; 

foo::foo(int s) : size(s) {} 

class bar 
{ 
    public: 
     bar(foo&); 
    private: 
     foo& fooreference; 
}; 

bar::bar(foo& reference) : fooreference(reference) 
{} 

foo firstclass(1); 
bar secondclass(firstclass); 
+0

생성자에서이 작업을 수행해야합니까, 아니면이 작업을 수행 할 별도의 방법이 있습니까? – grep

+0

@Headspin : 생성자. * 모든 * 회원은 공사 도중 초기화됩니다. 항상. 그게 무슨 의미입니까?) –

+0

바 클래스를 먼저 초기화하고 나중에 foo에 대한 참조를 설정해야하므로 이것이 나에게 문제가되는 것 같습니다. – grep

1

참조를 다시 장착 할 수 없으므로 이니셜 라이저 목록에 설정해야합니다.

struct Foo {}; 

struct Bar { 
    Bar(Foo &foo_) : foo(foo_) {} 
    void set(Foo &foo_) { foo = foo_; } // copies, doesn't reseat 
    Foo &foo; 
}; 
+0

사실,'Foo'를 다른'Foo'에 할당하면 오류가 발생하지 않을 것입니다; 당신은 초기화를 생략 할 수 있습니다. –

+0

@Tomalak Geret'kal 아, 그래, 내 예를 들어 내가 의미했던 것에 가깝지 않다. 복사/할당 작업입니다 –

+0

네, 맞습니다. –

1
bar::bar(foo & reference) 
{ 
    fooreference = reference; 
} 

fooreference는 또 다른 개체입니다. 할당하면 참조 사본을 만들고있는 것입니다. fooreferencereference의 별칭이 아닙니다.

관련 문제