gpt4 book ai didi

c++ - C++ 中的头文件和实现文件到底是什么?

转载 作者:太空狗 更新时间:2023-10-29 19:51:59 25 4
gpt4 key购买 nike

我有一个自定义 Stack 实现的示例。据我所知,.h 文件应该包含声明cpp 文件应该包含实现。我在 cplusplus.com/stack_example 上找到了自定义堆栈的示例它看起来像下面这样。

堆栈.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++ 规则的最佳方法是什么?

最佳答案

头文件与源文件没有根本区别。

原则上, header 可以包含与源文件相同的代码结构。按照惯例,头文件与源文件的唯一区别是头文件应该被其他文件#included,我们通常不会对源文件这样做(尽管我们可以,如果我们喜欢冒险的话)。

现在重要的是如果一个文件被多个 源文件#included 会发生什么。请注意,这基本上等同于将相同的代码复制粘贴到多个 .cpp 文件。在这种情况下,有些事情可能会给您带来麻烦。

特别是,如果您最终在两个不同的源文件中对同一符号有两个定义,则您的程序格式不正确(根据 the one-definition rule )并且链接器可能会拒绝链接您的程序。

对于不同的源文件,这通常不是问题,除非您不小心在不同的上下文中重用了一个名称。一旦头文件出现(只是复制粘贴的代码),事情就开始变得不一样了。您仍然可以在头文件中放置一个定义,但是如果该头文件随后被多个源文件拉入,那么您就严重违反了一个定义规则。

因此,惯例是只将可以安全地在多个源文件中复制的内容放入头文件中。这包括声明、内联函数定义和模板。

这里的关键认识可能是头文件是一种用于在源文件之间共享代码的相当古老的工具。因此,他们在很大程度上依赖于用户足够聪明,不会把事情搞砸。

关于c++ - C++ 中的头文件和实现文件到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33234444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com