我应该在头文件或源文件中使用构造函数实现结构吗?

时间:2012-09-13 14:12:58

标签: c++ struct constructor header

好的,我正在编写一个带有struct [在C ++中]的代码,我不确定是在头文件还是在源文件中实现该结构。

结构包含一个构造函数:

struct Point
{
    double x;
    double y;

    Point(double xCo, double yCo)
    {
        this->x = xCo;
        this->y = yCo;
    }

    int comparePoint(Point point)
    {
        ...
    }
};

我在头文件中写道:

typedef struct Point point;

它是否足够好,还是一个糟糕的设计? 正如我在一些网站上看到的那样,结构通常在头文件中实现,

但在之前的作业中,我[在C]课程的工作人员为我们提供了一个头文件,其中包括对结构的声明而不是实现。

我在这里看到的其他问题与此类似,但他们并没有真正回答我的问题。

4 个答案:

答案 0 :(得分:8)

C和C ++中使用struct之间存在很大差异。

在C中,struct声明声明一个带有标记的结构,而不是类型名称。因此,除非您在其周围添加struct Point,否则必须按标记引用typedef

在C ++中,structclass的同义词,仅在默认成员辅助功能中有所不同(class为私有,struct为public)。始终为没有struct的{​​{1}}定义类型名称,因此在C ++中在typedef周围添加typedef是不必要的。

这不会影响您声明构造函数的方式:您可以在标题中内联它,或将其移出到实现中。无论哪种方式它都会起作用。将args传递给头文件中的初始化列表的简单初始化程序可能更好,而更复杂的初始化可能应该放在cpp文件中,但这完全取决于你。

答案 1 :(得分:5)

对此没有答案,这实际上取决于具体情况。您是否关心客户端代码是否可以访问构造函数的实现,并且每次进行更改时都必须重新编译它?如果是这样,请不要在标题中实现它。请记住,在这种情况下,在C ++中structclass是等价的,因此相同的一般规则应适用于两者。

应该做的是使用构造函数初始化列表:

Point(double xCo, double yCo) : x(xCo), y(yCo) {}

答案 2 :(得分:3)

您可以在标头中声明构造函数并在cpp文件中记下实现:

struct Point
{
    Point(double xCo, double yCo);
    ...
};

Point::Point(double xCo, double yCo)
{
    ...
}

但是标题中必须有一个声明,因为编译器依赖它来构建依赖于struct的其他cpp文件。

答案 3 :(得分:1)

考虑到在C ++中,struct只是一个将“默认成员可访问性”设置为public而不是private的类,我建议您对结构执行完全相同的操作,就像编写类一样。