【发布时间】:2009-04-10 13:10:51
【问题描述】:
在阅读了关于the difference between pointers and references 的问题后,我决定对我的类字段使用引用而不是指针。然而,这似乎是不可能的,因为它们不能被声明为未初始化(对吗?)。
在我现在正在处理的特定场景中,我不想使用普通变量(顺便说一下,它们的正确术语是什么?)因为它们在我声明它们时会自动初始化。
在我的 sn-p 中,bar1 使用默认构造函数自动实例化(这不是我想要的), &bar2 导致编译器错误,因为您不能使用未初始化的引用(正确吗?),并且 *bar3 很高兴因为可以声明指针未初始化(顺便说一句,将其设置为 NULL 是最佳实践吗?)。
class Foo
{
public:
Bar bar1;
Bar &bar2;
Bar *bar3;
}
看起来我必须在这种情况下使用指针,这是真的吗?另外,使用变量的最佳方法是什么? -> 语法有点麻烦……运气不好? smart pointers 等呢?这相关吗?
更新 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 一起使用,它需要有默认构造函数。所以看起来我必须使用默认构造函数,因此必须使用指针。惭愧……是吗? :)
【问题讨论】:
-
“普通变量(顺便说一句,它们的正确术语是什么?)”您可以称它们为“堆栈变量”
-
"普通变量" --> "原始数据类型"
-
原始数据类型不是唯一的普通变量...您也可以将用户定义的数据类型作为普通变量。
-
嗯,当我说“普通变量”时,我的意思是“不是指针也不是引用”,所以我将 Foo::bar1 称为“普通变量” - 这是什么你们在说什么?
-
你称它为成员、指针成员或引用成员。