摘要
有没有办法在模板化类型上调用类方法,该模板可能是指针或引用而不知道哪个而不是获取编译器/链接器错误?
细节
我有一个模板化的QuadTree实现,可以采用以下任何非平凡的用户定义类型:
//Abstract Base Class
a2de::Shape
//Derived Classes
a2de::Point
a2de::Line
a2de::Rectangle
a2de::Circle
a2de::Ellipse
a2de::Triangle
a2de::Arc
a2de::Spline
a2de::Sector
a2de::Polygon
Run Code Online (Sandbox Code Playgroud)
但它们可能是指针或引用,因为它们都是从a2de :: Shape派生的.因此专业化被声明为:
template class QuadTree<a2de::Shape&>;
//...similar for all derived types as references.
template class QuadTree<a2de::Shape*>;
//...similar for all derived types as pointers
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是当间接(或缺少)未知时调用类方法的能力,并且由于模板,生成了两组代码:
template<typename T>
bool QuadTree<T>::Add(T& elem) {
//When elem of type T is expecting a pointer here
//-> notation fails to compile where T is a reference i.e.:
//template class QuadTree<a2de::Shape&>
//with "pointer to reference is illegal" …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用智能指针为类成员变量创建一个访问器.这是代码:
class MyResource
{
};
class MyClass
{
public:
std::unique_ptr<MyResource> getResource();
private:
std::unique_ptr<MyResource> resource;
};
std::unique_ptr<MyResource> MyClass::getResource()
{
return this->resource;
}
Run Code Online (Sandbox Code Playgroud)
我试图编译这个错误:
无法访问类'std :: unique_ptr <_Ty>'中声明的私有成员
添加.get
到this->resource
当然不会,因为返回类型的变化工作.
我不应该在这里使用unique_ptr吗?这只是一个语法问题吗?我完全走错了路吗?
我的智能指针背景: 我已经使用了几年的普通指针,部分原因是因为我找不到何时使用哪种智能指针以及如何使用它们的可靠解释.我已经厌倦了找借口,所以我只是潜入.我想我明白智能指针是什么以及为什么要使用它们,但我对细节知之甚少.目前,我完全迷失在关于智能指针的 无尽 问答中 .
在阅读了关于指针和引用之间差异的问题之后,我决定使用引用而不是指针用于我的类字段.然而,似乎这是不可能的,因为它们不能被宣布为未初始化(对吧?).
在我现在正在处理的特定场景中,我不想使用正常变量(顺便说一下它们的正确用语是什么?)因为它们在我声明它们时会自动初始化.
在我的代码片段中,bar1自动使用默认构造函数实例化(这不是我想要的),而bar2导致编译器错误,因为你不能使用未初始化的引用(正确吗?),而*bar3很高兴因为指针可以声明未初始化(顺便说一下,最好将此设置为NULL吗?).
class Foo
{
public:
Bar bar1;
Bar &bar2;
Bar *bar3;
}
Run Code Online (Sandbox Code Playgroud)
看起来我必须在这种情况下使用指针,这是真的吗?另外,使用变量的最佳方法是什么? - >语法有点麻烦......运气好吗?什么智能指针,等等?这有关系吗?
尝试在我的类中实现引用变量字段并在构造函数中初始化它之后,为什么我会收到以下错误?
../src/textures/VTexture.cpp: In constructor ‘vimrid::textures::VTexture::VTexture()’:
../src/textures/VTexture.cpp:19: error: uninitialized reference member ‘vimrid::textures::VTexture::image’
Run Code Online (Sandbox Code Playgroud)
这是真正的代码:
// VTexture.h
class VTexture
{
public:
VTexture(vimrid::imaging::ImageMatrix &rImage);
private:
vimrid::imaging::ImageMatrix ℑ
}
// VTexture.cpp
VTexture::VTexture(ImageMatrix &rImage)
: image(rImage)
{
}
Run Code Online (Sandbox Code Playgroud)
我也试过在标题中这样做,但没有运气(我得到同样的错误).
// VTexture.h
class VTexture
{
public:
VTexture(vimrid::imaging::ImageMatrix &rimage) : image(rImage) { }
}
Run Code Online (Sandbox Code Playgroud)
弗雷德拉森 - 是的!有一个默认的构造函数; 我忽略了它,因为我认为这与问题无关(我多么愚蠢).删除默认构造函数后,我导致编译器错误,因为该类与std :: vector一起使用,需要有一个默认构造函数.因此看起来我必须使用默认构造函数,因此必须使用指针.羞耻......或者是吗?:)
有人可以向我解释对象storage duration
和lifetime
对象之间的区别吗?我认为他们表示同样的事情.我找到了一个定义:
对象的生命周期等于或嵌套在其存储的生命周期内.
所以根据这个,我看不到有一点差别.另外,如果有人用低级别的术语向我解释这些概念,我将非常感激.我宁愿去想memory
,adresses
和data
比约高层次的东西.谢谢.
我非常精通C,并且在C中释放内存是必须的.
但是,我正在开始我的第一个C++项目,并且我已经听说过一些关于如何不需要释放内存的东西,使用共享指针和其他东西.
我应该在哪里读到这个?这是否适合替代正确的delete
C++功能?它是如何工作的?
编辑
我很困惑,有些人说我应该分配使用new
并使用智能指针进行重新分配过程.
其他人说我不应该首先分配动态内存.
其他人说,如果我使用新的我也必须像C一样使用删除.
那么哪种方法被认为更标准,更经常使用?
我正在编写一个C++析构函数(我希望这是正确的术语;我是C++的新手)并且我对垃圾收集的确切需要并不是肯定的.假设我有2个指针作为实例变量我需要垃圾收集吗?如果我有一个对象作为实例变量呢?或指向对象的指针?
对于究竟需要删除的内容以及自动清理的内容,我只是有点模糊.
谢谢
如果我不使用new
分配类的数据成员,是否还需要在析构函数中进行清理?例如,在下面的例子中,我需要delete
向量吗?还是依赖于MyType
?
class A {
A();
~A();
MyType x;
std::vector<MyType> v;
};
A::A() {
x = MyType(42);
v = std::vector<MyType>(5);
}
A::~A() {
// what goes here?
}
Run Code Online (Sandbox Code Playgroud) 假设我有两个A类和B类.B类有两种方法可以使用A.
第一:
class B
{
A *a;
}
Run Code Online (Sandbox Code Playgroud)
第二:
class B
{
A a;
}
Run Code Online (Sandbox Code Playgroud)
为什么大多数C++库比较喜欢使用First
版本Second
.使用第二种方法可能有什么不利之处.它与Stack vs Heap赋值有关吗?请澄清.