头文件。等等

时间:2011-03-24 16:53:24

标签: c++ class header

我定义了一个简单的类。该定义位于头文件中,并且实现位于cpp文件中:

HEADER:

#ifndef POINT_H
#define POINT_H

class Point {
public:
    Point(int x, int y);

    int getX();
    int getY();

private:
    int x, y;
};

#endif

CPP

#include Point.h

Point::Point(int x=2, int y=2) {
    this->x = x;
    this->y = y;
}

int Point::getX() {
    return x;
}

int Point::getY() {
    return y;
}

这不是编译,我不知道为什么。此外,当我想实例化一个点 在其他地方,比如main.cpp,我在顶部是什么#include,只是Point.h?如果是这样,看看Point.cpp怎么知道?

5 个答案:

答案 0 :(得分:8)

#include Point.h 

您需要Point.h附近的引号。

Point::Point(int x=2, int y=2) 

默认参数应该在头文件的声明中,而不是在.cpp文件的定义中(它将按原样编译,但不会按照你想要的那样进行编译)。

在风格上,将局部变量或参数命名为与成员变量相同通常是一个坏主意:这样做很容易导致混淆。您还可以使用初始化列表初始化成员变量:

Point::Point(int x_, int y_) : x(x_), y(y_) { }

由于您的代码目前已编写,xy都已构建,因此您可以为其分配。使用初始化列表可以消除赋值并直接构造它们。这对于像int这样的基本类型无关紧要,但它对类类型很重要。

  

这不是编译,我不确定原因。

通常编译器发出的错误消息很有帮助。如果没有别的,如果它对你没有帮助,那对我们这些想要帮助的人有帮助。

  

另外,当我想在其他地方实例化一个点时,比如 main.cpp ,我在顶部有什么#include,只有 Point.h

  

如何知道查看Point.cpp?

您编写的每个.cpp文件都会编译为单独的目标文件。将所有.cpp文件编译成目标文件后,所有目标文件都会链接到一个excecutable(或库)中。链接器指出了所有内容的定义。

答案 1 :(得分:1)

您应该将参数默认值放在标题中,尽管没有错误消息我不能说这是否是您的问题。您还应该引用包含#include "Point.h"

答案 2 :(得分:1)

您的包含

中缺少引号
#include "Point.h"

在要实例化Point的文件中,必须包含Point.h

答案 3 :(得分:1)

您在实现中定义了x和y的默认值。这不行。如果您的类的客户端只看到标题,因此不知道它们可能在没有默认参数的情况下调用Point,那么请想一想这应该如何工作?

诀窍是将实现编译到您的应用程序中,并且仅使用声明(标题中的内容)来解析调用。对于每次调用,编译器都会创建一个符号名称并标记该调用(例如,当您调用Point :: getX时,编译器将插入看起来像call _getX@Point@的调用)。编译器之后的链接器将搜索此函数。如果已实现,则会找到它,并且调用者将被“重定向”到Point::getX()源代码。

[编辑]哦,你需要写#include“Point.h”。

答案 4 :(得分:0)

你得到的错误是什么?

您只需添加.h文件:

#include "Point.h"

链接器在构建可执行文件时解析对代码的引用。