После прочтения вопроса о различиях между указателями и ссылками, Я решил, что хочу использовать ссылки вместо указателей для полей моего класса. Однако кажется, что это невозможно, потому что они не могут быть объявлены неинициализированными (верно?).
В конкретном сценарии, над которым я сейчас работаю, я не хочу использовать обычные переменные (кстати, какой для них правильный термин?), Потому что они автоматически инициализируются, когда я их объявляю.
В моем фрагменте bar1 автоматически создается с помощью конструктора по умолчанию (что не то, что я хочу), & bar2 вызывает ошибку компилятора, потому что вы не можете использовать неинициализированные ссылки (правильно?), А * bar3 доволен как larry, потому что указатели могут быть объявленным неинициализированным (кстати, лучше ли установить это значение в NULL?).
class Foo
{
public:
Bar bar1;
Bar &bar2;
Bar *bar3;
}
Похоже, в этом сценарии мне нужно использовать указатели, это правда? Кроме того, как лучше всего использовать переменную? Синтаксис -> немного громоздок ... Не повезло? А как насчет интеллектуальных указателей и т. Д.? Это актуально?
Обновление 1:
Почему после попытки реализовать поле ссылочной переменной в моем классе и его инициализации в конструкторе может появиться следующая ошибка?
../src/textures/VTexture.cpp: In constructor ‘vimrid::textures::VTexture::VTexture()’:
../src/textures/VTexture.cpp:19: error: uninitialized reference member ‘vimrid::textures::VTexture::image’
Вот настоящий код:
// VTexture.h
class VTexture
{
public:
VTexture(vimrid::imaging::ImageMatrix &rImage);
private:
vimrid::imaging::ImageMatrix ℑ
}
// VTexture.cpp
VTexture::VTexture(ImageMatrix &rImage)
: image(rImage)
{
}
Я тоже пробовал сделать это в шапке, но не повезло (у меня та же ошибка).
// VTexture.h
class VTexture
{
public:
VTexture(vimrid::imaging::ImageMatrix &rimage) : image(rImage) { }
}
Обновление 2:
Фред Ларсон - Да! Есть конструктор по умолчанию; Я пренебрегал этим, потому что думал, что это не имеет отношения к проблеме (как глупо с моей стороны). После удаления конструктора по умолчанию я вызвал ошибку компилятора, потому что класс используется с std :: vector, который требует наличия конструктора по умолчанию. Похоже, я должен использовать конструктор по умолчанию и, следовательно, должен использовать указатель. Позор ... или нет? :)
type_index
cass в LLVM. Конструктор использует ссылку наtype_info
, но внутреннее закрытое поле, в котором он содержится, является указателем на объектtype_info
. Почему они внутренне используют указатель вместо ссылки? github.com/llvm/llvm-project/blob/ main / libcxx / include / Альтернативный вариант impl, который использует ссылку gist .github.com / apivovarov / - person x4444   schedule 18.12.2020