C++ 对C+感到困惑+;当想要在另一个CPP中使用它们时。[来自C#]

C++ 对C+感到困惑+;当想要在另一个CPP中使用它们时。[来自C#],c++,C++,在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(

在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的正确步骤是什么,而不是重新实现所有的方法?

< P>您不必在每个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
文件被交给链接器,链接器可以找出定义的位置,并将代码正确地拼凑在一起。

头文件
.h
包含类规范。相应的
.cpp
文件包含实现,并编译为
.o
文件。在开发过程中,您将包括
.h
文件以访问类提供的API。在编译/链接阶段,您将包括
.o
文件以及源文件,以形成最终的二进制文件。你不需要再对你使用的类进行任何的操作。

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

所以您只需要包含“ClassA.h”文件,就可以很好地编译了


因为在C和C++中,你会看到一些不同于C语言的行为。比如,在C或C++中,只有两个不同的项目(方法、变量等)在不同的文件中被命名为相同的,只要文件之外都没有一个是可见的。而在C#中,您必须使用不同的名称空间或不同的名称。注意-我并不是说这是一个好的实践,这是可能的。

为什么要重新实现代码?实现要么在
.h
文件中给出,要么在单独编译的
.cpp
文件中给出,您可以将程序链接到该文件。啊!所以你基本上只实现一次,然后共享.h?太好了,当我想到你必须把所有的实现都重新包含进去时,我很害怕。我开始喜欢C++:染料,你可以在 > H>代码>文件(即头文件)中实现所有的东西。如果需要,请确保将函数声明为
inline
。或者,您可以将实现放在
.cpp
文件中,将其编译到库中并共享。有关如何做出决策的更多信息,请参阅和。“在OOP中…”您描述的内容与面向对象编程无关。这是构建模型。C++有一个基于翻译单元的古模型,对象文件几乎完全没有元数据,而C语言有模块。