9

好的,我正在用 [in 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

4 回答 4

11

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

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

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

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

于 2012-09-13T14:17:55.630 回答
10

structC 和 C++ 的用法有很大的不同。

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

在 C++ 中,struct是 的同义词class,不同之处仅在于默认成员可访问性(私有为class,公共为struct)。类型名称总是为struct没有 a定义的,因此在C++ 中typedef添加 a是不必要的。typedefstruct

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

于 2012-09-13T14:18:57.837 回答
6

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

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

Point(double xCo, double yCo) : x(xCo), y(yCo) {}
于 2012-09-13T14:14:59.660 回答
1

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

于 2012-09-13T14:23:11.090 回答