我有自定義堆棧實現的例子。據我瞭解,.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)或其他不透明的結構指針。 –