Определение методов C ++ внутри класса, таких как Java

Я программист на Java и я новичок в программировании на C ++. В Java мы должны написать все классы в отдельных файлах, и все определения методов находятся прямо внутри класса.
Но теперь, в C ++, мне интересно, почему C ++ позволяет программистам писать определение метода вне класса.
Есть ли способ писать программы на C ++, такие как Java?

2

Решение

Вы можете написать код для ваших классов в заголовочном файле, если хотите. Это делает заголовочный файл в C ++ похожим на Java-файл в Java.

MyClass.h

#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

Но вы также можете разделить заголовок и код на два файла в C ++. Это позволяет разделить определение и объявление методов и уменьшает зависимости заголовка времени компиляции.

Обратите внимание, что в приведенном выше примере любой класс, который включает в себя 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

#ifndef _MYCLASS_H_
#define _MYCLASS_H_

class OtherClass;

class MyClass {
public:
MyClass();

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

private:
OtherClass* _otherClass;
};
#endif

MyClass.cpp

#include "MyClass.h"#include "OtherClass.h"
MyClass::MyClass() : _otherClass(0) {}

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

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

Другие решения

Но теперь, в C ++, мне интересно, почему C ++ позволяет программистам писать определение метода вне класса.

Двумя основными причинами являются времена компиляции и отделение реализации от интерфейса. Это рассматривается более подробно в В C ++, почему есть заголовочные файлы и файлы cpp?

Есть ли способ писать программы на C ++, такие как Java?

Вы мог напишите всю свою реализацию в заголовочных файлах, но вы не должен. При написании кода в любой язык, вы должны следовать идиомам этого языка, так как это облегчает чтение и обслуживание.

3