2

在 OOP 中,您希望将程序分解为多个类。

在 C# 中,您可以这样做:

namespace a
{
  public class ClassA
  {
     //Methods...that are defined and have code in them.

  }
}

要使用该类,您只需执行“使用命名空间 a;”。

假设我想在 C++ 中创建一个类,定义它们,然后将代码放入其中。

class ClassA
{
  public:
   void methodA();
}

ClassA::methodA()
{
  //implementation.
}

要访问此实现,您只需使用#include "ClassA.h"。我完全理解,然后您必须再次实现该代码?这似乎适得其反,因为我喜欢将我的项目分散到很多课程中。

那么实现 ClassA 并且不再重新实现它的所有方法的正确程序是什么?

4

3 回答 3

3

您不必在每个 CPP 文件中重新实现它们,C++ 链接器负责确保定义匹配在一起。

所有你需要的是:

一个标题:

#ifndef FOO_H
#define FOO_H

class Foo{
  //Junk goes here
};

#endif

一个cpp:

#include "foo.h"

//implementations for junk goes here
void Foo::junk(){

}

然后你可以包括foo.h. 每个 cpp 都会被编译成一个.o文件。然后,这些.o文件被交给链接器,链接器可以找出定义的位置并正确地将代码拼凑在一起。

于 2012-10-30T03:04:41.420 回答
2

C 和 C++ 有不同的做事方式。只要您有一个类、方法或外部变量的声明,编译器就会很高兴地编译并在链接时忽略方法、类等的实际定义。这简化了很多事情,但基本上编译器会在目标文件中给链接器留下一个提示,说链接器需要在这里插入方法的地址。

所以你只需要包含“ClassA.h”文件就可以编译好了。

Because of this you see some different behavior in C and C++ than you would in C#. For example, in C or C++ it's perfectly fine to have two different items (methods, variables, etc) that are named the same in different files as long as neither one is visible outside the file. Whereas in C# you would have to use different namespaces or different names. Note - not that I'm saying this is good practice, it's just possible.

于 2012-10-30T03:05:38.547 回答
1

.h文件包含类规范。相应的.cpp文件包含实现并编译为.o文件。在开发过程中,您将包含.h文件以访问该类提供的 API。在编译/链接阶段,您还可以将.o文件与源文件一起包含以形成最终的二进制文件。你不需要再次实现任何东西,你正在使用的类。

于 2012-10-30T03:05:23.033 回答