对在头文件中实例化指针感到困惑

时间:2013-11-22 02:50:47

标签: c++

我正在读一本书,它说明了在头文件中添加内容的以下原则:

  

“你可以把什么放入头文件?基本的   rule是“only declarations”,也就是说,只有编译器的信息   但没有通过生成代码或创建来分配存储的任何东西   变量。这是因为通常会包含头文件   在项目的几个翻译单元中,如果存储为一个   标识符分配在多个位置,链接器将出现多重定义错误...“

但是,它会给出一个这样的头文件的例子:

#ifndef STACK_H
#define STACK_H

struct Stack
{
    struct Link 
    {
        void* data;
        Link* next;
        void initialize(void* dat, Link* nxt);
    } *head;
    ...
};

#endif

变量“head”不是一个对象并且违反了这个规则吗?即使它是一个指针,如果多个编译单元包含此头文件导致“多重定义”,它将占用存储并导致问题?

2 个答案:

答案 0 :(得分:2)

您正在声明成员变量。即使它不是指针也不是问题。它是类(结构)声明的一部分。

只有在实例化Stack类型的对象时,才会实际进行存储分配。

答案 1 :(得分:0)

在决定需要放入头文件的内容时,应该在脑中运行的问题是“这是否需要事先定义?”。在查看实现之前,需要知道用户定义的对象(结构和类)和方法(函数)定义的定义,然后才能在实现中调用它们。

标题文件中包含哪些内容?

  • 数据的定义
  • 方法的定义
  • 全局变量的分配(有时

在这种情况下,没有分配任何内容。你在这里说的就是我们定义Stack包含一个指向链接的成员。当然,我们还需要定义链接,链接被定义为使用Stack结构的范围。

如果我继续,我会听起来像this thread,我将把你的注意力集中在那里。理解头文件的想法,总是一个棘手的障碍。