我对指针比较新,并编写了这个合并函数。这是指针的有效使用吗?其次是*two
变量,它们合并后不应删除吗?这将是客户的任务,而不是实施者?
VectorPQueue *VectorPQueue::merge(VectorPQueue *one, VectorPQueue *two) {
int twoSize = two->size();
if (one->size() != 0) {
for (int i = 0; i < twoSize;i++)
{
one->enqueue(two->extractMin());
}
}
return one;
}
交换函数就像这样调用
one->merge(one, two);
将这两个对象传递给合并
PQueue *one = PQueue::createPQueue(PQueue::UnsortedVector);
PQueue *two = PQueue::createPQueue(PQueue::UnsortedVector);
答案 0 :(得分:4)
在你的情况下,指针是完全没必要的。你可以简单地使用参考文献。
也无需传入调用成员函数的参数。您可以使用this
指针获取调用成员函数的对象。
/// Merge this with other.
void VectorPQueue::merge(VectorPQueue& other) {
// impl
}
一般来说:实现具有继承的容器并不是首选的样式。看看标准库以及它如何实现序列(迭代器)的抽象。
答案 1 :(得分:1)
乍一看,我看不到任何与指针有关的问题。虽然我更喜欢使用引用,并使merge
成为VectorPQueue
的成员函数,所以我不必传递第一个参数(正如其他人已经指出的那样)。另一件令我困惑的事情是检查one->size() != 0
- 如果one
为空,会出现什么问题?下面的代码仍会正确地将two
插入one
,因为它仅取决于two
的大小。
关于删除two
:
这将是客户的任务,而不是实施者
嗯,这取决于你想要如何设计你的界面。但由于该函数只将two
的元素添加到one
,我会说它不应该删除它。顺便说一句,我认为这个方法的更好名称是addAllFrom()
或类似的东西。
关于一般指针:
我强烈建议您查看智能指针。这些是C ++中用于减少内存管理工作的常用技术。使用裸指针并通过new / delete手动管理它们非常容易出错,很难做到异常安全,几乎可以保证你的内存泄漏等。另一方面,智能指针会自动删除它们包含的指针需要更多。出于说明的目的,如果您的编译器支持C ++ 11,则C ++ std lib具有auto_ptr
(unique_ptr
和shared_ptr
。它的使用方式如下:
{ // Beginning of scope
std::auto_ptr<PQueue> one(PQueue::createPQueue(PQueue::UnsortedVector));
// Do some work with one...:
one->someFunction();
// ...
} // End of scope - one will automatically be deleted
我的个人经验法则:只使用智能指针中包含的指针。根本只使用堆分配的对象,如果:
在所有其他情况下,我尝试尽可能使用堆栈分配的对象和STL容器。
如果你从C ++开始,这一切看起来可能很多,并且在你冒险进入智能指针等之前尝试完全理解指针是完全正确的(甚至可能是必要的)..但它节省了大量的时间稍后花点调试。我还建议你阅读一些关于C ++的书籍 - 我实际上认为我理解大部分C ++,直到我读完第一本书:)