2010-12-06 223 views
2

大约14年前,我编写了一些C++。我熟悉.NET等与我一起工作的大多数新技术。为什么在创建新的C++类时创建了两个文件(.h和.cpp)?

现在,我正在编写一个simlpe电话列表Windows应用程序,我想使它成为C++,这样我可以更好地查看C#和C++的区别。

让我说,我已经注意到了一个区别! Hehehe ...因此,这些区别之一是,当从Visual Studio模板创建一个新的C++类时,它不仅会创建.cpp类文件,还会创建一个头文件。

这是为什么?为什么要为一个类创建一个class1.h和一个class1.cpp文件?

我记得头文件可能是函数和对象的库,如果我们可以这样说,为了将来的重用,我记得没有错吗?

问题

  1. 为什么有两个文件(.H和.cpp)添加一个新的C++类时产生的?
  2. 我应该在头文件中定义成员并在cpp文件中定义函数核心吗?
  3. 如果不是2,那么这个特定场景中的头文件是什么?

编辑#1

然后应我的代码是这样的?

// Customer.h header file 
ref class Customer { 
    private: 
     char* _number, _name; 
     long _phoneNumber; 

    public: 
     char[] get_number(); 
     void set_number(char* number); 
     char[] get_name(); 
     void set_name(char* name); 
     long get_phoneNumber(); 
     void set_phoneNumber(long phoneNumber); 
     void set_name(char* name); 
} 

然后:

// Customer.cpp 
#include <Customer.h> 

char[] Customer::get_number() { 
    return _number; 
} 

void Customer::set_number(char* number) { 
    if (number != null && sizeof(number) < 1) return; 
    _number = number; 
} 

// And the other members here... 

现在我知道,有大部分是很多在我的代码错误。如果你帮我纠正错误,我会很高兴,这样我就可以提高我的C++技能。

感谢您帮助我找出答案。

+1

这是C++/CLI - 你想使用本机C++还是托管C++代码?有很大的不同。 – 2010-12-06 20:31:42

+0

@Steve:谢谢你向我指出这一点。其实我不能说。我猜想原生C++对我来说更适合在C++中充分使用,这样我就可以快速启动并运行,从而有效地开发应用程序,对吗?还是值得的? – 2010-12-06 20:43:14

回答

2

C++中的函数和类必须在使用之前声明,这只是一个声明,声明可以从这个文件使用这些函数。这些声明是使用头文件导入的(.hpp/.h文件)。

要声明一个功能,你可以写成这样:

return typefunction name(arguments);

所以这个功能:

int factorial (int x) 
{ 
    if (x == 0) 
    return 1; 
    return x * factorial (x - 1); 
} 

会预先声明像这样:

int factorial (int x); 

声明的类是这样的:

classclass name{function and variable declarations};

所以class Foo与方法bar和公共成员变量baz应该是这样的:


foo.hpp:

#ifndef FOO_HPP_ 
#define FOO_HPP_ 

class Foo 
{ 
public: 
    int baz; 

    void bar(); 
}; 

#endif 

foo.cpp:

#include "foo.hpp" 
#include <iostream> 

void Foo::bar() 
{ 
    std::cout << baz << std::endl; 
} 
1

类在头文件中声明,大多数功能在.cpp文件中定义。该工具正在帮助您完成接口与实施的分离。

考虑报头和cpp文件之间的分离的方法是:

  • 集管包含由其他文件一起使用声明。
  • .cpp文件包含实现。

原因是你想要很多文件能够利用功能,但你只想实际定义在一个地方的功能。

1

头文件声明/定义一个类。它包含成员函数,成员数据,朋友等。通常,它不包含很多(如果有的话)实现(模板是例外)。

执行文件(* .cpp)就是这样的:它们实现了这个类。你不需要使用实现文件(如果你告诉VS向导你想创建一个内联类,它只会创建头文件),但通常这只能用于模板类(例如STL类和boost库中的许多类)或非常简单的类。

1

C++编译需要头文件,因为它与C#几乎没有区别。

在C#中,二进制模块之间的链接始终是动态的。在C++中,静态和动态链接有所不同。为了详细说明,我需要整整一小时的写作,但让我们说这是最短的方法。

在C++中,每个.cpp文件都被分别编译到一个目标文件中。该文件需要链接到其他人才能形成一个二进制文件。头文件声明了包含它的.cpp文件所需的所有方法签名,该文件是调用为该类定义的方法的文件。

在C#中,所有文件都被编译成一个二进制文件,即。编译器总是知道正在编译的成员可以看到哪些类和方法。

相关问题