2012-09-13 52 views
5

好吧,我用一个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; 

是不是不够好,或者是一个不好的设计? 正如我在一些网站上看到的,通常在头文件中实现一个结构体,

但是在我之前的任务中,课程的教职员工为我们提供了一个头文件,其中包含了对结构的声明和不是执行。

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

+4

在C++中,typedef是不必要的。这是一个C语言。 – Antimony

+0

这没什么大不了的。一个区别是,如果您将实现放在头文件中,那么任何函数都必须内联(它们在上面的示例代码中默认为内联)。 – john

回答

3

你可以声明构造在头和写在cpp文件的实现:

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

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

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

+0

确定但是,[这听起来很愚蠢,但是..]我将如何达到结构中的“x”和“y”? 如果我正在写一个类,并且x,y被定义为私有的,我会添加get/set函数以达到x,y变量。 这里有必要这样做吗? 因为如果我不这样做,我得到一个错误。 –

+0

@NadinHaddad:如果你的x和y数据成员是'public',你不需要get/set方法:你可以使用点符号(或' - >'符号,如果你引用了结构/类实例通过指针)。 –

5

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

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

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

C和C++中的struct用法有很大的区别。

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

在C++中,structclass的同义词,仅在缺省构件的易用性(私人为class,公众struct)不同。一个类型名称总是为struct定义,没有typedef,所以在C++中在struct附近添加一个typedef是不必要的。

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

1

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

相关问题