C ++:指针和抽象数组类

时间:2013-01-11 19:57:38

标签: c++ pointers abstract-class

我对指针比较新,并编写了这个合并函数。这是指针的有效使用吗?其次是*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);

2 个答案:

答案 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_ptrunique_ptrshared_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

我的个人经验法则:只使用智能指针中包含的指针。根本只使用堆分配的对象,如果:

  • 他们必须比创建它们的范围更长寿,并且副本太昂贵了(C ++ 11幸运地有移动语义,这消除了很多这样的情况)
  • 我必须在它们上面调用虚函数

在所有其他情况下,我尝试尽可能使用堆栈分配的对象和STL容器。

如果你从C ++开始,这一切看起来可能很多,并且在你冒险进入智能指针等之前尝试完全理解指针是完全正确的(甚至可能是必要的)..但它节省了大量的时间稍后花点调试。我还建议你阅读一些关于C ++的书籍 - 我实际上认为我理解大部分C ++,直到我读完第一本书:)

相关问题