Tôi đã thấy rằng có một số mô hình khác nhau trong C ++ liên quan đến những gì đi vào tệp tiêu đề và những gì đối với tệp cpp. AFAIK, hầu hết mọi người, đặc biệt là những người từ nền C, làm:
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; }
Tuy nhiên, các giảng viên của tôi thường dạy C ++ cho những người mới bắt đầu như thế này:
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
Ban đầu đến từ Java, tôi cũng luôn bị mắc kẹt theo cách thứ hai này vì một số lý do, chẳng hạn như tôi chỉ phải thay đổi thứ gì đó ở một nơi nếu tên giao diện hoặc phương thức thay đổi, tôi thích cách thụt lề khác nhau của các lớp trong khi tôi nhìn vào thực hiện của họ, và rằng tôi thấy tên dễ đọc foo
hơn so với foo::foo
.
Tôi muốn thu thập pro và con cho cả hai cách. Có lẽ vẫn còn những cách khác?
Tất nhiên, một nhược điểm của tôi là sự cần thiết phải khai báo chuyển tiếp.
foo.cpp
bây giờ không có gì để làm vớifoo
lớp của bạn và nên để trống (có thể nhưng#include
để làm cho hệ thống xây dựng của bạn hài lòng).