好的,我正在编写一个带有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]课程的工作人员为我们提供了一个头文件,其中包括对结构的声明而不是实现。
我在这里看到的其他问题与此类似,但他们并没有真正回答我的问题。
答案 0 :(得分:8)
C和C ++中使用struct
之间存在很大差异。
在C中,struct
声明声明一个带有标记的结构,而不是类型名称。因此,除非您在其周围添加struct Point
,否则必须按标记引用typedef
。
在C ++中,struct
是class
的同义词,仅在默认成员辅助功能中有所不同(class
为私有,struct
为public)。始终为没有struct
的{{1}}定义类型名称,因此在C ++中在typedef
周围添加typedef
是不必要的。
这不会影响您声明构造函数的方式:您可以在标题中内联它,或将其移出到实现中。无论哪种方式它都会起作用。将args传递给头文件中的初始化列表的简单初始化程序可能更好,而更复杂的初始化可能应该放在cpp文件中,但这完全取决于你。
答案 1 :(得分:5)
对此没有答案,这实际上取决于具体情况。您是否关心客户端代码是否可以访问构造函数的实现,并且每次进行更改时都必须重新编译它?如果是这样,请不要在标题中实现它。请记住,在这种情况下,在C ++中struct
和class
是等价的,因此相同的一般规则应适用于两者。
应该做的是使用构造函数初始化列表:
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的类,我建议您对结构执行完全相同的操作,就像编写类一样。