2016-10-21 10 views
1

Я работаю над реализацией связанного списка на C++, и мне было интересно узнать время жизни исходных данных. Допустим, вызывающая программа создает новый ListNode со следующим конструктором. Моя проблема заключается в том, что исходная переменная может сильно отличаться от области действия, оставляя неопределенное поведение, если назначение члена данных не является копией значения.Определение члена класса с помощью ссылки, переданной через конструктор

ListNode<T>::ListNode(const T &value) : data(value) {} 

Когда передается значение данных в списке параметров он будет определять данные в виде копии значения или будет член класса будет связан с исходным переменным передаются в конструктор?

EDIT: Добавление большего количества информации для ясности

list_node.hpp

template <typename T> 
class ListNode 
{ 

friend class List<T>; 

public: 
    ListNode<T>(const T &); 

private: 
    T data; 

}; 

list.hpp

template<typename T> 
class List 
{ 
public: 
    void insert_at_front(const T &); 
private: 
    ListNode<T> *get_new_node(const T &); 
}; 

list.cpp

void List<T>::insert_at_front(const T &value) 
{ 
    ListNode<T> *new_node_ptr = get_new_node(value); 

    ... 
} 

ListNode<T> *List<T>::get_new_node(const T &value) 
{ 
    return new ListNode<T>(value); 
} 
+5

Это зависит от типа данных. – juanchopanza

+0

Если вы хотите получить копию, вы должны передать ее по значению, а не по ссылке. Но, конечно, если 'data' является ссылкой, это не поможет. –

+0

Значение сообщения объявления 'data'. – juanchopanza

ответ

4
struct Foo { 
    Foo(const Bar& b) : m_b(b) {} 

    Bar m_b;  
}; 

struct Foo2 { 
    Foo2(const Bar& b) : m_b(b) {} 

    const Bar& m_b;  
}; 

Как вы можете видеть, код конструктора одно и то же, но эти два класса сделать что-то другое. Первый класс сделает копию пройденного Bar, поэтому он «безопасен», если локальная переменная передается в поле выходит из области видимости. Второй класс просто захватывает ссылку. Фактически это похоже на ссылку на переменную, которая была передана. Поэтому, если переменная, переданная в поле, выходит за пределы области видимости, тогда Foo2 будет иметь ссылку на свидание.