Я использую библиотеку, которая возвращает мне ссылку.
Мне нужно использовать эту ссылку в качестве атрибута класса.
Невозможно напрямую инициализировать атрибут в конструкторе (необходимо инициализировать библиотеку lib).до этого) я думал об использовании shared_ptr для отложенной инициализации:
#include <iostream>
#include <string>
#include <tr1/memory>
//This is library, cannot touch
std::string globalString = "TEST";
std::string& getStringReference()
{
return globalString;
}
//this is my class which uses the library
class Foo
{
public:
Foo() :
testString_( std::tr1::shared_ptr< std::string& >() )
{
//do some initialization of the library here...
//now init the shared_ptr
testString_.reset( getStringReference() );
}
std::string getString() const
{
return *testString_;
}
private:
std::tr1::shared_ptr< std::string& > testString_;
};
//and a main to be compilable and check if the above works...
int main()
{
Foo foo;
std::cout << foo.getString() << std::endl;
}
Но, к сожалению, это не работает.g ++ выдает такие сообщения:
error: forming pointer to reference type ‘std::string&’
Я пробовал другие способы получить ссылку в shared_ptr, но ничего не работает ... Возможно, вы могли бы дать мне подсказку.
Примечание:
- В "реальном мире" вместо std :: string тип данных - это класс без конструктора по умолчанию.
- Для тех, кто все еще задается вопросом: приведенный выше пример представляет собой упрощенный пример кода:)
ОБНОВЛЕНИЕ:
- Пытаясь применить предложения, я обнаружил, что, в отличие от используемого std :: string из примера, у моего класса есть конструктор личных копий.Это означает, что я не могу просто скопировать объект в новый.