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

Nad*_*dad 5 c++ constructor struct header

好吧,我正在编写带有struct [在C++中]的代码,我不确定是在头文件还是源文件中实现struct.

该struct包含一个构造函数:

struct Point
{
    double x;
    double y;

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

    int comparePoint(Point point)
    {
        ...
    }
};
Run Code Online (Sandbox Code Playgroud)

我在头文件中写道:

typedef struct Point point;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pav*_*nev 11

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

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

Point::Point(double xCo, double yCo)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


das*_*ght 8

structC和C++的使用情况有很大差异.

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

在C++中,struct是一个同义词class,仅在默认成员可访问性(private for class,public for struct)中有所不同.A型的名字总是为所定义的struct不带typedef,所以增加了typedef周围的struct在C++中是不必要的.

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


jua*_*nza 5

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

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

Point(double xCo, double yCo) : x(xCo), y(yCo) {}
Run Code Online (Sandbox Code Playgroud)