【问题标题】:Header files. etc头文件。等等
【发布时间】:2011-07-22 07:33:19
【问题描述】:

我定义了一个简单的类。定义在头文件,实现在cpp文件:

标题:

#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 中查找?

【问题讨论】:

  • 在 main 中,您确实只包含了 point.h,point.cpp 是一个文件,如果您将其添加到项目中,它将自动包含在内。
  • 我认为你缺少引号,应该是#include "Point.h"
  • point.cpp 是一个编译单元,就像main.cpp 一样。编译它们时,您创建的对象都知道point 的结构,因为它们包含相同的头文件。当您链接两个对象时,您将获得可执行文件。你不需要编译main.h的实现,你需要结构的声明。
  • 顺便说一句,如果您在构造函数中重命名参数,则不需要使用this-> 语法。此外,更喜欢在构造函数中使用 initialization 列表。

标签: c++ class header


【解决方案1】:
#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 这样的基本类型无关紧要,但对于类类型却很重要。

这不是编译,我不知道为什么。

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

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

是的。

它是如何知道在 Point.cpp 中查找的?

您编写的每个 .cpp 文件都会编译成单独的目标文件。一旦所有的 .cpp 文件被编译成目标文件,所有的目标文件都被链接到一个可执行文件(或库)中。链接器会找出所有内容的定义位置。

【讨论】:

  • 感谢您的详细回复:)
  • @user620189 ,如果您发现某个答案有帮助,请点击答案旁边的复选标记大纲接受它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你遇到了什么错误?

    您只需包含 .h 文件:

    #include "Point.h"
    

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

    【讨论】:

      【解决方案4】:

      您的包含中缺少引号

      #include "Point.h"
      

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-03-27
          • 2023-04-03
          • 1970-01-01
          • 2021-09-16
          • 1970-01-01
          • 2017-12-06
          • 2012-06-13
          • 2013-12-26
          • 2016-03-03
          相关资源
          最近更新 更多