我在大约14年前编写了一些C ++程序。我熟悉.NET等新技术,我主要与之合作。
现在,我正在编写一个simlpe手机列表Windows应用程序,我希望将其作为C ++,以便我可以更好地查看C#和C ++差异。
让我说我已经注意到了一个区别!呵呵呵......因此,其中一个不同之处在于,当从Visual Studio模板创建一个新的C ++类时,它不仅会创建.cpp类文件,还会创建一个头文件。
为什么会这样?为什么要为一个classe创建class1.h和class1.cpp文件?
我记得头文件很可能是函数和对象的库,如果我们可以这么说,为了将来重用,我还能记得吗?
问题
编辑#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 ++技能。
感谢您帮助我搞清楚。
答案 0 :(得分:3)
C ++中的函数和类必须在使用之前声明,这只是一个声明,说明这些函数可以在这个文件中使用。这些声明是使用头文件(.hpp
/ .h
文件)导入的。
要声明一个函数,你可以这样写:
return type
function name
(
arguments
);
< / p>
所以这个功能:
int factorial (int x)
{
if (x == 0)
return 1;
return x * factorial (x - 1);
}
将预先声明如下:
int factorial (int x);
声明类是这样的:
class
class 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 :(得分:1)
类在标头中声明,大多数功能在.cpp文件中定义。该工具正在帮助您实现界面与实现的分离。
考虑标题和.cpp文件之间分离的方法是:
原因是您希望许多文件能够利用功能,但您只想在一个地方实际定义该功能。
答案 2 :(得分:1)
头文件声明/定义一个类。它包含成员函数,成员数据,朋友等。通常,它不包含太多(如果有的话)实现(模板是例外)。
实现文件(* .cpp)就是:它们实现了类。
您不必使用实现文件(如果您告诉VS向导您要创建内联类,它只会创建头文件),但通常只对模板类(例如STL)执行此操作类和boost库中的许多类)或非常简单的类。
答案 3 :(得分:1)
C ++编译需要头文件,因为它与C#几乎没有区别。
在C#中,二进制模块之间的链接始终是动态的。在C ++中,静态和动态链接之间存在差异。进入细节,我需要整整一个小时的写作,但让我们说它是最短的方式。
在C ++中,每个.cpp文件都单独编译为目标文件。该文件需要链接到其他文件才能形成二进制文件。头文件声明包含它的.cpp文件所需的所有方法签名,这是调用为该类定义的方法的文件。
在C#中,所有文件都被编译成单个二进制文件,即。编译器总是知道您正在编译的成员可以看到哪些类和方法。