Инициализируйте ссылочную переменную как член класса - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь преобразовать функцию из SDK камеры, которую я использую, в класс, чтобы я мог вызывать различные части функции по отдельности (инициализация, захват изображения, очистка). У меня проблема в том, что некоторые переменные в функции определены как:

type& var = type::init();

Это не работает, когда я делаю:

class myClass
{
private:
type& var;
};

Я пытался изменить:

type& var;

Кому:

type* var;

И это прекрасно работало, когда у меня все было в одной функции, но когда я пытаюсь разбить его на отдельные функции в классе, код компилируется, но не запускается. Что-то не так с моим кодом?

EDIT: Код взят из Basler's SDK, оригинальный код:

Pylon::CTlFactory& TlFactory = Pylon::CTlFactory::GetInstance();

В заголовочном файле:

Pylon::CTlFactory *TlFactory;

и файл cpp:

TlFactory = &Pylon::CTlFactory::GetInstance();

Как уже упоминалось, когда весь код находится в одной функции, он компилируется и работает нормально, только когда я разбиваю его на функции класса, у меня возникают проблемы ...

Ответы [ 3 ]

7 голосов
/ 11 октября 2011

Ссылки не присваиваются. Когда у вас есть ссылка в качестве объекта члена класса, вам нужно инициализировать ее в конструкторе. Для этого вы используете список инициализации конструктора:

class myClass
{
public:
    myClass( type& some_var )
      : var( some_var )
    {}

private:
    type& var;
};
0 голосов
/ 11 октября 2011
class myClass
{
public:
    myClass() : var(Pylon::CTlFactory::GetInstance())
    {
        // rest of init logic
    }
private:
    Pylon::CTlFactory& var;
};
0 голосов
/ 11 октября 2011

В дополнение к ответу К-балла, обратите внимание на эту (полезную, IMO) особенность правил области видимости C ++: вы можете выставить то же имя, что и формальный параметр в конструкторе.Это позволяет легко вырезать и вставлять код, избавляя от необходимости мечтать об «одноразовых» именах.

class myClass
{
public:
    myClass( type& var )
      : var( var )
    {}

private:
    type& var;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...