Я бачив, що в C ++ є кілька різних парадигм, що стосуються того, що входить до заголовкового файлу та що до файлу cpp. AFAIK, більшість людей, особливо ті, що знаходяться на С, роблять:
foo.h
class foo {
private:
int mem;
int bar();
public:
foo();
foo(const foo&);
foo& operator=(foo);
~foo();
}
foo.cpp
#include foo.h
foo::bar() { return mem; }
foo::foo() { mem = 42; }
foo::foo(const foo& f) { mem = f.mem; }
foo::operator=(foo f) { mem = f.mem; }
foo::~foo() {}
int main(int argc, char *argv[]) { foo f; }
Однак мої викладачі зазвичай навчають C ++ для початківців так:
foo.h
class foo {
private:
int mem;
int bar() { return mem; }
public:
foo() { mem = 42; }
foo(const foo& f) { mem = f.mem; }
foo& operator=(foo f) { mem = f.mem; }
~foo() {}
}
foo.cpp
#include foo.h
int main(int argc, char* argv[]) { foo f; }
// other global helper functions, DLL exports, and whatnot
Початково з Java, я також завжди дотримувався цього другого шляху з кількох причин, наприклад, що мені потрібно щось змінити лише в одному місці, якщо змінюються назви інтерфейсу чи методу, що мені подобаються різні відступи речей у класах, коли я подивіться на їхню реалізацію, і що я вважаю імена більш зрозумілими foo
порівняно з foo::foo
.
Я хочу зібрати профі та шахрайство в будь-який спосіб. Можливо, є ще й інші способи?
Одним із недоліків мого шляху є, звичайно, необхідність періодичних декларацій вперед.
foo.cpp
тепер не має нічого спільного з вашимfoo
класом, і його слід залишати порожнім (можливо, але для того,#include
щоб зробити вашу систему побудови щасливою).