2013-07-05 2 views
0

질문에 거의 다 나와 있습니다. 빈 STL 컨테이너 (더 정확하게는 std::set)에 대한 참조를 초기화해야합니다.생성자에서 빈 STL 컨테이너에 대한 참조를 초기화하는 방법은 무엇입니까?

시도에 :

bozo.cc:104: error: invalid initialization of non-const reference of type ‘bozo_set&’ from a temporary of type ‘bozo_set’ 

(그냥 보조 노트 :

typedef std::set<bozo *> bozo_set; 
class BozoClass { public: BozoClass(): bozosetref(bozo_set()) {} } 

과 유사한 컴파일러 오류를 얻을 것이다이 하지 내가 나이 나에 대한 typedef를 사용하지 말아야 여부를 묻는입니다 아니, 나는 그것에 대해 의견을 가지고 있지만, 이것은 실제 질문이 아닙니다.)

EDIT : 이 점에 대해 많은 논평을하고 있는데, 이것에 대한 언급이있는 점은 바깥 클래스가 bozo 요소를이 집합의 요소로 변경하는 것을 허용하는 것입니다. 대신 BozoClass에 불필요한 메소드가 필요합니다.

+1

무엇에 사용 하시겠습니까? 어쨌든 매달린 참조입니다. 집합에 포인터가 포함되어 있다는 사실 (특히 원시 집합)은 경보도 설정합니다. – chris

+1

'bozosetref'는 임시로 바인드 할 수없는 참조 유형 ('std :: set &')입니다. – 0x499602D2

+0

이것은 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)입니다. 임시 집합에 대한 참조를 취하는 방법을 묻는 중입니다. 집합을 소유하는 클래스를 생성하는 방법을 물어보고 소유 클래스의 클라이언트 집합에 쉽게 액세스 할 수 있어야합니다. –

답변

1

당신이 겪고있는 문제는 실제로 컴파일러 오류에 의해 잘 설명되어

invalid initialization of non-const reference of type ‘bozo_set&’ from a temporary of type ‘bozo_set’

컴파일러는 임시의 기준을하려고하는 당신을 말하고있다. 당신이 참조를 취하는 것이 임시이기 때문에 * 할 수 없습니다. 즉, 즉시 존재하지 않을 것입니다.

bozosetref(bozo_set()) 
      ^^^^^^^^^^ 

즉시 bozosetref(bozo_set())bozo_set()에서 인스턴스화 set가 파괴됩니다, 실행이 완료된 표현에 :에 언급 된 임시 존재는 bozo_set 여기 구축하는 것이다.

아마도 bozosetrefset<bozo*>&의 멤버 변수입니다.

BozoClass자신의set에 대한 참조를하려는 것 같습니다. 즉 괜찮지 만, 당신이 일반적으로 그렇게 할 방법이 간단하게 직접 하나의 인스턴스에 의해 set에 대한 참조를 복용하지 않음으로써,하지만 : 이제

class BozoClass 
{ 
public: 
    BozoClass() {} 
private: 
    set<bozo*> mBozos; 
}; 

, mBozosset에 대한 참조가 아니라 set 자체 .

그런 다음 접근을 통해 BozoClass의 고객에 대한 참조를 제공 할 수

:

int main() 
{ 
    BozoClass bc; 
    bc.GetBozos().insert (new bozo); // or something 
} 

: 클라이언트가 차례 사용 &이 접근을 통해 직접 set을 수정할 수 있습니다

class BozoClass 
{ 
public: 
    // ... 
    set<bozo*>& GetBozos() { return mBozos; } 
}; 

  • 실제로는 이 아니어야합니다. 이렇게하십시오. 집합 자체는 변수에 할당되지 않았으므로 변수에 "보유"할 수 없습니다. 가져온 참조는 유효하지 않게됩니다.
+0

이것은 실제로 내 문제를 해결합니다. 아직, 내가 왜 안되니? – Matoe

+0

@Matoe : 이미 대답했습니다. "즉시 사라질 것입니다." –

+0

@Matoe : 편집을 참조하십시오. 약간의 정교함을 추가했습니다. –

0

const가 아닌 개체에 참조를 전달할 수 없습니다.
위와 같은 일이 허용된다면 클래스의 bozo_set의 이미 삭제 된 임시 인스턴스에 대한 참조를 얻을 수 있지만 빈 세트에 대한 참조는 얻지 못할 것입니다.

1
#include <set> 

struct Class { 
    Class() : set(), setref(set) {} 

    std::set<void *> set; 
    std::set<void *> &setref; 
}; 
+0

솔루션에 세트 및 참조가있는 경우 세트가없는 것이 좋습니다. 참조가 중복됩니다. – Borgleader

+1

질문에 더 많은 것이 있어야한다고 생각합니다. 예를 들어 클래스 내에 여러 생성자가있는 경우 그 중 하나는 참조를 보유 할 컨테이너를 제공하고 그렇지 않은 컨테이너는 제공합니다 (그리고 자신을 할당해야합니다). 그렇지 않으면 예, 이상합니다. –

+0

참조를 사용하는 이유에 대한 내 질문에 편집을 추가했습니다. – Matoe

관련 문제