C+的定义+;类内部的方法,如Java 我是java程序员,我是C++编程新手。在java中,我们必须在单独的文件中编写所有类,并且所有方法的定义都在类中。 但是现在C++中,我想知道为什么C++允许程序员在类外写方法的定义。 有没有办法编写像java一样的C++程序?< p>你可以在头文件中为你的类编写代码,如果你喜欢的话。这使得C++中的头文件与java中的java文件类似。 MyClass.h 但您也可以将头和代码分成C++中的两个文件。这允许您分离方法的定义和声明,并减少编译时头依赖关系

C+的定义+;类内部的方法,如Java 我是java程序员,我是C++编程新手。在java中,我们必须在单独的文件中编写所有类,并且所有方法的定义都在类中。 但是现在C++中,我想知道为什么C++允许程序员在类外写方法的定义。 有没有办法编写像java一样的C++程序?< p>你可以在头文件中为你的类编写代码,如果你喜欢的话。这使得C++中的头文件与java中的java文件类似。 MyClass.h 但您也可以将头和代码分成C++中的两个文件。这允许您分离方法的定义和声明,并减少编译时头依赖关系,java,c++,class,class-design,Java,C++,Class,Class Design,请注意,在上面的示例中,包含MyClass.h的任何类都将自动包含OtherClass.h,无论它是否需要它,并且对OtherClass.h的更改将需要重新编译MyClass.h的所有客户端 但是,在下面的单独示例中,有一个OtherClass.h的正向声明(这是可能的,因为它仅用作指针),而实际的OtherClass.h仅包含在cpp文件中。现在对OtherClass.h的更改只会强制重新编译MyClass.cpp,而不会强制重新编译MyClass.h的客户端(除非它们还包括OtherClas

请注意,在上面的示例中,包含MyClass.h的任何类都将自动包含OtherClass.h,无论它是否需要它,并且对OtherClass.h的更改将需要重新编译MyClass.h的所有客户端

但是,在下面的单独示例中,有一个OtherClass.h的正向声明(这是可能的,因为它仅用作指针),而实际的OtherClass.h仅包含在cpp文件中。现在对OtherClass.h的更改只会强制重新编译MyClass.cpp,而不会强制重新编译MyClass.h的客户端(除非它们还包括OtherClass.h)

这还意味着您可以更改MyClass::get(),只需重新编译MyClass.cpp,而不是MyClass的所有客户端

MyClass.h MyClass.cpp <>但是现在C++中,我想知道为什么C++允许程序员在类外写方法的定义。p> 两个主要原因是编译时间和将实现与接口分离。这将在中详细介绍

<>有没有办法编写C++程序,比如java?< /p>
您可以在头文件中编写整个实现,但不应该这样做。在用任何语言编写代码时,都应该遵循该语言的习惯用法,因为这样更易于阅读和维护。

您可以像在Java中一样将它们放在类中。你试过了吗?你有什么问题?将它们保存在一个单独的文件中可以减少编译时间,并允许人们看不到实现,在
之外定义的方法类似于
java
中的
静态
方法
如果您愿意,您也可以将这些方法添加到
中,作为
静态
方法。
>在java中,我们必须将所有类写入单独的文件中,并且所有>方法的定义都在类内部。我首先学习了
C++
,然后学习了
Java

当你想在同一个文件中定义许多类时,我感到惊讶,并认为
在单独的文件中定义每个类和每个方法必须在类中强制执行,就像
愚蠢的
方式一样。@govindo为什么这是愚蠢的方式?怎么了?我认为,在大型项目中,当我们在类外定义方法时,项目将无法管理。是真的吗?我错过了关于一个文件中有多个类的部分。这是可能的,如果您有多个密切相关的类,并且总是一起使用,那么这可能很有用。但是,如果您在同一个文件中有几个不相关的类,那么当您需要编辑其中一个类时,您就不知道要打开哪个文件,这就更令人困惑了。一般来说,我会在每个文件中放一个类,如果几个类密切相关,您可以创建一个单独的目录并将cpp/h文件放在那里。@Khajavi将它们放在单独的文件中实际上根本不会影响可管理性。来自面向C的背景,不将它们分开实际上让人觉得更难管理,因为没有办法轻易地扫描一个类有哪些公共方法!“你可以,但不应该”——这是一个很好的观点,每个人在使用新语言时都应该记住这一点。即使它确实让人觉得是一种愚蠢、愚蠢、烦人的做事方式。。。也许有一种方法可以让那些制定标准的人变得疯狂!
#ifndef _MYCLASS_H_
#define _MYCLASS_H_

#include "OtherClass.h"

class MyClass {
public:
    MyClass() { _otherClass=0; }

    void set(OtherClass* oc) { _otherClass = oc; );
    OtherClass* get(void) { return _otherClass; };

private:
   OtherClass* _otherClass;
};
#endif
#ifndef _MYCLASS_H_
#define _MYCLASS_H_

class OtherClass;

class MyClass {
public:
    MyClass();

    void set(OtherClass* oc);
    OtherClass* get(void);

private:
   OtherClass* _otherClass;
};
#endif
#include "MyClass.h"
#include "OtherClass.h"

MyClass::MyClass() : _otherClass(0) {}

MyClass::set(OtherClass* oc) { _otherClass=oc; }

OtherClass* MyClass::get() { return _otherClass; };