我在将我的引用计数指针<Type>
类的实例放入我的Array类时遇到问题。使用调试器,似乎永远不会调用构造函数(这会弄乱引用计数并导致段错误!)
我的push_back功能是:
void push_back(const T& element)
{
if (length >= max)
reallocate(max > 0 ? max * 2 : 1);
new (&data[length]) T(element);
++length;
}
引用计数与new之后的引用计数相同。我很确定这是问题,但我无法弄清楚为什么不会调用构造函数。另外,Pointer :: Pointer(...)编译是否需要指针<T>
&amp;或const指针<T>
&amp; (嗯?),并且也有问题!
也许有一些关于展示位置的详细信息我没有考虑到。如果有人有一些想法,他们会非常感激!
编辑:[根据要求,指针的相关摘录]
// ...
private:
T* p;
public:
//! Constructor
Pointer()
: p(0)
{
}
//! Copy Constructor
template<class X> Pointer(Pointer<X>& other)
: p(other.getPointer())
{
if (p)
p->incrementRef();
}
//! Constructor (sets and increments p)
Pointer(T* p)
: p(p)
{
if (p)
p->incrementRef();
}
//! Destructor (decrements p)
~Pointer()
{
if (p)
p->decrementRef();
}
// ...
我还为指针<T>
&amp;实现了operator =和T*
,以及运营商 - &gt;和运算符T*
答案 0 :(得分:2)
根据docs构造函数应该被调用...你可以检查几件事:
测试指针:
Pointer<int> p1(new int);
Pointer<int> p2(p1); // Does this call constructor properly?
测试数组:
Array<std::string> array;
std::string str("bla");
array.push_back(str); // Does this call string's constructor
那是失败的,对吧?
Array<Pointer<int> > array;
Pointer<int> p1(new int);
array.push_back(p1);
如果所有其他方法都失败了,您可以随时执行此操作以确保调用复制构造函数或operator =
T* t = new (&data[length]) T();
*t = element;
答案 1 :(得分:2)
您的评论和代码不同步:
//! Copy Constructor
template<class X> Pointer(Pointer<X>& other)
从类模板生成的构造函数不是复制构造函数(在12.8 [class.copy]中有一个脚注说明了这一点),因此不会阻止编译器生成复制构造函数。这个生成的构造函数将更好地匹配标准副本,因为非模板函数比重载解析中的模板函数更受欢迎。
您似乎需要在指针类中编写显式复制构造函数以获得所需的效果。
答案 2 :(得分:0)
请在此发布您的Pointer课程。 我觉得这堂课的T是指针吗? 如果代码应该这样做: new(&amp; data [length])指针(元素);
我很难理解......
为什么不这样做: data [length] = element; 我假设数据[长度]是指针