2014-07-10 4 views
0
Edge 

{ 
    Vertex& v1; 
    Vertex& v2; 
    float cost; 
public : 
    Edge(Vertex& v_1, Vertex& v_2) : 
     v1(v_1), v2(v_2) 
    { 
    } 
    // other getter and setter functions 
}; 

벡터 allEdges는 어떻게 만듭니 까? 벡터로 지원되는 기본 생성자와 대입 연산자를 생성해야하지만, 이미 기본 생성자가 없기 때문에 문제가 발생한다는 것을 알 수 있습니다.참조가 들어있는 객체의 벡터

나는 std :: vector가 내게 소리 치는 기본 생성자를 만들었지 만, 옳은 일처럼 보이지는 않습니다.

+0

상당히이다 : 아래의 예에서 알 수있는 바와 같이

그러나 차례로 멤버 변수로서 참조가 개체의 벡터를 갖는 완전히 허용 가능 제한적. – 101010

+0

저는 정점을 복사하기 때문에 요소를 사용하고 싶지 않습니다. 꼭지점은 const로 남아 있지만 (추가/제거되지 않음) 구현 후 5 년 후에도 동일하게 유지 될 것이라고 말할 수는 없습니다. – navderm

+2

당신은'Vertex'에 대한 포인터를 사용할 수 있습니다. – 101010

답변

2

참조를 멤버 변수로 사용하는 것은 생성자의 초기화 프로그램 목록에서 초기화해야하기 때문에 매우 제한적입니다. 멤버 변수로서 참조를 갖는

#include <vector> 
#include <iostream> 

struct Vertex { 
    std::size_t id; 
    Vertex(std::size_t const _id) : id(_id) {} 
}; 

class Edge { 
    Vertex& v1; 
    Vertex& v2; 
    double cost; 
public : 
    Edge(Vertex& v_1, Vertex& v_2, double const _c) : v1(v_1), v2(v_2), cost(_c) {} 
    Vertex& getv1() const { return v1; } 
    Vertex& getv2() const { return v2; } 
}; 

int main() { 
    Vertex v1(1), v2(2); 
    std::vector<Edge> alledges; 
    alledges.push_back(Edge(v1, v2, 1.0)); 
    for(auto i : alledges) std::cout << i.getv1().id << "->" << i.getv2().id << std::endl; 

    return 0; 
} 

LIVE DEMO

+0

을 사용하는 것입니다. 감사 ! – navderm

관련 문제