帮助我理解C ++头文件和类

时间:2010-12-30 00:42:23

标签: c++

好的,所以我试图从中间Delphi过渡到C ++面向对象的编程。我已经阅读了Ivar Horton关于visual C ++ 2010的书。我可以解决简单的控制台应用程序没问题。我得到了语言本身(有点)。我正在努力的是标题和类。

我也理解头文件和类通常会做什么。我什么时候没有得到的是我何时使用标题或类?我需要为我所做的一切创建课程吗?我的实际工作函数是否需要在头文件或CPP文件中?我对这些的正确使用感到迷茫,并且可以使用来自更有经验的程序员的一些真实世界的指导。

我正在尝试使用MFC过渡到Windows应用程序,如果这有用的话。

6 个答案:

答案 0 :(得分:3)

  

我也明白了什么头文件   和课程一般。我是什么   没有得到的是实施时   使用标题或类?我   需要为一切创建类   我做?我的实际工作职能是否需要   在头文件或CPP文件中?   我对这些的正确使用感到迷茫   并可以使用一些现实世界的指导   来自更有经验的程序员。

重新缠绕几年,我也遇到了同样的问题 - 这不是我想不到的。因此,让我们分解一下我认为是问题的一部分。

  

我   需要为一切创建类   我呢?

那是主观的,但我会说不。您需要为要建模的事物创建一个类,这样做才有意义。一个示例可能是比C类型更复杂的数据项,如intchar。您还应该使用String类和STL的容器(查看向量)。简而言之,这意味着你可能会为你所做的大多数事情使用一个类,但这并不意味着你的代码的每一个最后一小部分都必须以某种方式落入某个类的某个地方。

  

我也明白了什么头文件   和课程一般。

让我重复一下你所得到的。您可能已经意识到,C因此C++需要在编译单元中不在其之前的函数的原型定义(在所有标头替换其包含之后的完整源代码)。就这样:

#include <iostream>
using namespace std;

int testadd()
{
    int a = 4; int b = 2; int c = add(a, b);
    return c;
}

int add(int x, int y)
{
    return x + y;
}

int main(int argc, char** argv)
{
    cout << "result is: " << c << endl;
    return 0;
}

(已解决的示例)不起作用,因为testadd无法找到add,但main可以找到add

所以你的程序理想情况下应该从你想要使用的所有函数,类等列表开始。有人认为,如果这些文件与实现文件分开,那将是一个好主意,因为它使得阅读更容易,并且使用您的工作(在库场景中)从重新编写原型到函数中节省程序员。使用任何其他库变得更加容易。

因此,当您实现类时,您可以选择:

  1. 以原型形式声明类(函数以原型结尾)并以cpp为单位实现它们。
  2. 在头文件中实现整个批次。
  3. 你所做的就是老实说。我坚持1,因为我认为它更好,但是没有人说你必须和我看过这两种技术。

    顺便说一句,值得一提的是,如果你选择1,假设你有main.cpp,myclass.h,myclass.cpp,你从main.cpp调用myclass.cpp中实现的myclass方法,编译时会发生什么这两个单元(* .cpp)被编译为机器代码形式(在vc的情况下为main.obj和myclass.obj)。然后,链接器负责将这两个对象引入exe,确保在每个编译单元中调用的所有符号函数都可以在其中一个引用的其他对象或库中找到。如果发生这种情况,它会将exe放在一起。如果没有,则会出错。这是导致学习用户引发此类问题的另一个后果(链接错误)。

答案 1 :(得分:2)

C ++中的标题就像Delphi单元中的接口;它们定义了其他编译​​单元允许了解的内容(通过原型和声明),以及允许相关编译单元了解其他编译单元(通过外部声明)。单个编译单元程序并不严格要求它们,但它们可以帮助您考虑明确的职责分离。

C ++中的类与Delphi中的类非常相似;你在适合任务时使用它们。

答案 2 :(得分:2)

我也理解头文件和类通常会做什么。

不,抱歉。我怕你没有。我只能通过你在该声明中使用的术语来说明。

“标题”和“类”这个词不仅不是排他性的,也不是相关的...它们甚至不在同一级别。

“class”是C ++语言结构。

“header”是文件系统上包含C ++代码的文件。

我认为你所说的语境中“class”的意思正确地称为“翻译单元”,一个.cpp文件。这里的问题是类与翻译单元没有任何形式的1:1甚至1:多种关系。类代码的比特可以出现在任意数量的.cpp文件中.cpp文件可以包含任意数量的类和其他内容。

事实上,如果我们继续使用不正确的术语,并跳过一些不方便的事实,那么应该将 headers 称为“类”文件,因为那里通常会出现类定义(部分说{...};)。尽管如此,我们还是要把这个世界留给另一个世界,因为你完全可以自由地在翻译单元中定义类。

标题和翻译单元(或“源文件”,如果需要)之间的区别在于标题中的代码不会被编译为标题元素,它完全卡在您包含它的“源文件”中。换句话说,标题永远不会被编译,它们是经过预处理的。

您在标题中添加的内容是您希望在包含它们的任何位置复制/粘贴的内容。类定义或声明只是其中的两个。您可能希望包含内联函数代码(您希望编译器将代码粘贴到其中而不是跳转到的代码 - 尽管这不是确切的故事)。模板是其他可以放入标题的好东西,因为它们必须完全存在,无论你在哪里尝试实例化它们(所以它们必须在任何地方进行复制/粘贴)。

您在“源文件”中添加的内容是您只想要其中的内容,或者是因为您只想要本地访问,或者因为该内容的多个示例会违反该语言(非内联的多个定义) ,例如全局f()函数。

所以,很高兴能够同时帮助并高兴地混淆。我知道你仍然不理解它,但至少你现在已经意识到这一点。

答案 3 :(得分:1)

头文件不是必需的。理论上,您可以仅使用实现文件构建整个应用程序。头文件的要点是将定义与实现分开。它们是一种使链接和编译更容易/更快的方法。

不,你不需要为一切创建类。全局函数在C ++中是完全合法的。

答案 4 :(得分:0)

哎哟.. 这是一个很大的话题。你问的是解释OOP的整个概念。 网上有很多关于它的东西。首先我发表:
OOP Concept in Java - 这个是Java,但概念是一样的。 而且在C ++中你还有这个愚蠢的标题。标题是关于类包含内容的基本信息。所以标题本身没有关键代码,只有“介绍”。在编译期间,代码取自类。我希望它有所帮助。

答案 5 :(得分:0)

David Parsons的

Object Oriented Programming with C++如果您想要另一本书来帮助您,可以很容易地遵循好的例子:)