Как вы можете инициализировать класс ссылочным членом из частного конструктора? - PullRequest
3 голосов
/ 12 ноября 2008

Я создаю интерфейсную оболочку для класса. Член в классе является ссылкой (чтобы избежать копирования большой структуры). Если я создаю приватный конструктор, каков наилучший способ инициализации этой ссылки для успокоения компилятора?

struct InterfaceWrapper {
    InterfaceWrapper( SomeHugeStructure& src ):m_internal(src){};
    int someElement(void) const { return m_internal.someElement; };
private:
    InterfaceWrapper(){}  // initialize m_internal
    SomeHugeStructure& m_internal;
};

Ответы [ 4 ]

4 голосов
/ 12 ноября 2008

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

Если цель состоит в том, чтобы ограничить доступ друзьям класса, то вам, вероятно, лучше всего иметь член-указатель (предпочтительно умный указатель) и установить для него значение NULL.

-

Кроме того, я не уверен, почему вы сделали это структурой, а не классом. В общем, создание чего-то структуры имеет смысл, когда вы представляете элементы данных как общедоступные, подобно C. В этом случае похоже, что у вас есть обычный класс, и в этом случае соглашение C ++ заключалось бы в том, чтобы сделать его классом.

4 голосов
/ 12 ноября 2008

Если вам действительно нужно создать класс без элемента, ссылка не является подходящим способом.

Если ваша единственная причина использовать ссылку - это избегать копирования, я бы предложил использовать указатель. Вы можете просто взять адрес переданной ссылки в вашем обычном конструкторе и инициализировать его значением NULL в частном конструкторе. Когда время жизни объекта заканчивается, указатель будет висящим указателем, но то же самое верно для ссылок ...

В качестве альтернативы, пусть публичный конструктор возьмет умный указатель и использует такой умный указатель как член, если вы беспокоитесь о времени жизни.

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

2 голосов
/ 12 ноября 2008

Если вы делаете ctor по умолчанию закрытым, чтобы никто не мог его использовать, просто оставьте его без тела:

private:
    InterfaceWrapper();
    SomeHugeStructure& m_internal;

Компилятор будет думать, что он определен в другом месте, и компоновщик не будет возражать, что это не так, если кто-то не попытается его использовать.

1 голос
/ 12 ноября 2008

Какой смысл частного ctor? Если m_internal не ссылается на действительный объект, как это может быть полезно?

Также m_internal-> не будет компилироваться. Это синтаксис указателя, а не ref.

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