我有自定义堆栈实现的例子。据我了解,.h
文件应该只包含声明和的cpp
文件应该只包含实现。我在cplusplus.com/stack_example上找到了一个自定义堆栈的例子,它看起来像下面这样。什么是头文件和C++中的实现文件?
Stack.h文件
#ifndef _STACK_H_
#define _STACK_H_
#include <iostream>
#include "Exception.h"
template <class T>
class Stack {
public:
Stack():top(0) {
std::cout << "In Stack constructor" << std::endl;
}
~Stack() {
std::cout << "In Stack destructor" << std::endl;
while (!isEmpty()) {
pop();
}
isEmpty();
}
void push (const T& object);
T pop();
const T& topElement();
bool isEmpty();
private:
struct StackNode { // linked list node
T data; // data at this node
StackNode *next; // next node in list
// StackNode constructor initializes both fields
StackNode(const T& newData, StackNode *nextNode)
: data(newData), next(nextNode) {}
};
// My Stack should not allow copy of entire stack
Stack(const Stack& lhs) {}
// My Stack should not allow assignment of one stack to another
Stack& operator=(const Stack& rhs) {}
StackNode *top; // top of stack
};
现在我有问题。这个.h
文件显然揭示了一些实现细节。构造函数和析构函数都在.h
文件中执行执行。根据我的理解,这些应该在.cpp
文件中执行。此外,还有struct StackNode
这也是在.h
文件中实现。这甚至有可能在.cpp
文件中实现,只能在头文件中声明它?作为一般规则,如果这些文件位于.cpp
实施文件中,这会不会更好?编码这个东西的最好方法是什么,以便遵循C++规则?
你把事情需要由多个[翻译单元]可以使用头文件(http://en.wikipedia.org/wiki/Translation_unit)。如果你想隐藏实现细节,可以考虑使用[the pimpl idiom](http://c2.com/cgi/wiki?PimplIdiom)或其他不透明的结构指针。 –