константная ссылка должна быть инициализирована в базе конструктора / инициализатора элемента - PullRequest
9 голосов
/ 02 июля 2010

Я пытаюсь заблокировать доступ к конструктору по умолчанию для класса, который я пишу.Конструктор, который я хочу, чтобы другие использовали, требует константной ссылки на другой объект.Я сделал конструктор по умолчанию закрытым, чтобы другие не могли его использовать.Я получаю сообщение об ошибке компилятора для конструктора по умолчанию, потому что переменная-член const не правильно инициализирована.Что я могу сделать, чтобы сделать эту компиляцию?

class CFoo
{
public:
    CFoo();
    ~CFoo();
};

class CBar
{
public:
    CBar(const CFoo& foo) : fooReference(foo)
    {
    }

    ~CBar();

private:
    const CFoo& fooReference;

    CBar() // I am getting a compiler error because I don't know what to do with fooReference here...
    {
    }
};

Ответы [ 2 ]

13 голосов
/ 02 июля 2010

не объявлять конструктор по умолчанию. Он все равно недоступен (автоматически), если вы объявляете свой собственный конструктор.

class CBar
{
public:
    CBar(const CFoo& foo) : fooReference(foo)
    {
    }
private:
    const CFoo& fooReference;
};

Довольно подробное объяснение конструкторов можно найти здесь: http://www.parashift.com/c++-faq-lite/ctors.html

4 голосов
/ 02 июля 2010

Самый простой способ создать конструктор по умолчанию, который вы не хотите использовать (как в случае с вашим конструктором, верно?), Просто не определить его, то есть:

class CBar
{
public:
    CBar(const CFoo& foo) : fooReference(foo)
    {
    }

    ~CBar();

private:
    const CFoo& fooReference;

    CBar();
};

Inв этом случае это может быть немного лишним, потому что компилятор не будет создавать конструктор по умолчанию для класса со ссылочным членом, но лучше поместить его туда, если вы удалите ссылочный член.

...