【发布时间】:2013-06-06 17:51:04
【问题描述】:
我不认为自己在 C++ 方面知识渊博,但我很难理解这个概念。所以我有一个类,它包含一些模板数据类型和一个双精度。我希望 m_data 变量是通用的,但现在我只使用无符号整数进行测试。当我使用指向无符号整数的指针调用函数 SetData() 时,我丢失了指针指向的信息。当我超出范围时会发生这种情况,所以我觉得我需要对其进行深层复制......
我尝试了许多不同的构造函数和赋值运算符,但我仍然丢失了信息......我觉得我在这里遗漏了一些关于模板的明显内容。如果有人能指出我为什么会丢失数据的正确方向,我将不胜感激。
一小段代码:
template<typename T>
class PointNode {
public:
PointNode(double p){ m_point = p;}
~PointNode();
void SetData(T * data);
T * GetData() const;
private:
double m_point;
T *m_data;
};
template<typename T>
void PointNode::SetData(T * data)
{
m_data = data;
}
template<typename T>
T * PointNode::GetData()
{
return m_Data;
}
确定更多信息。这个类被存储在另一个类成员的映射中。这里有一点。
template<typename T>
class AuMathPointTreeT
{
public:
//Member Variables
double m_dTolerance;
unsigned int m_cPoint;
map<VectorKey, PointNode<T> > m_tree; /*map posing as a tree */
typename map<VectorKey, PointNode<T> >::iterator iter; /* iterator */
pair< typename map<VectorKey, PointNode<T> >::iterator, bool > return_val;
/* Tree methods */
//constructor
AuMathPointTreeT(double tol);
...
};
在另一个程序中,我正在使用这个类,创建节点并像这样设置模板数据
if (node = pnttree.AddPoint(point) )
{
unsigned int * data = new unsigned int();
*data = pntCount;
node->SetData(data);
++pntCount;
}
更新:好的,发现了问题的罪魁祸首,并希望就如何处理它提出建议。当我将一个节点插入到映射类中时,会在该过程中调用一些函数,并且我会丢失指向新分配的节点类对象的原始指针。这就是我正在做的事情。
template<typename T>
PointNode<T> * AuMathPointTreeT<T>::
AddPoint(double point)
{
PointNode<T> * prNode = MakeNode(point);
m_cPoint++;
return prNode;
}
template<typename T>
PointNode<T> * AuMathPointTreeT<T>::
MakeNode(double point)
{
PointNode<T> * prNode = new PointNode<T>;
//set the contents for the node just performs a few calcs on the values
prNode->SetNode(point, m_dTolerance);
//Create the key class using the
VectorKey key(point, m_dTolerance);
//Store the key,node as a pair for easy access
return_val = m_tree.insert( pair<VectorKey, PointNode<T> >(key, *prNode) );
if (return_val.second == false)
prNode = NULL;
unsigned int * test = new unsigned int;
*test = 55;
prNode->SetData(test); //if call this here its no longer the right pointer
return prNode;
}
所以看了这个......我真的还是想返回一个指针并使用它。但也许迭代器被 return_val 持有?我也对各个方面的建议持开放态度。对不起,这个问题一团糟:\
【问题讨论】:
-
为什么你的
m_data是T*,而不是T? -
我希望它是指向数据的指针,这不可能吗?
-
请向我们展示你是如何使用你的班级的。
-
当然有可能,就是不明白为什么
-
请显示一个使用这个类的代码,因为我觉得这个代码很好
标签: c++ templates pointers generic-programming