[C++] Split class and header to separated files with Visual Studio
Thói quen của sinh viên là viết Code luôn tuồn trên cùng một file. Khi biên dịch, file đó có kích thước rất lớn, chương trình chạy chậm, dễ phát sinh lỗi, vân vân và vân vân. Vậy làm thế nào để có thể tách các thành phần trong code ra thành những file riêng?
Nếu bạn chưa có nền tảng về lập trình hướng đối tượng bằng C++, hãy quay lại blog này sớm nhất có thể ngay khi bạn đủ khả năng nhé.
1. Không nên
Việc tạo class trong file riêng bắt buộc bạn phải dùng câu lệnh include một thư viện nhiều lần. Trong file riêng và trong chương trình chính
std;
using namespace
2. Nên
Không cần phải làm như vậy. Việc include một thư viện trùng lặp sẽ phát sinh lỗi.
Thay vào đó, trong file header của class, hãy thêm câu lệnh sau:
các thư viện cần thiết
các dòng lệnh
Sau đó, trong hàm main, bạn include thêm file header.h
vừa tạo
3. Ví dụ
Để giúp các bạn hình dung rõ hơn, bạn có thể xem một số screen shot
Khai báo tên class trong PhoneNumber.h
Sau đó, trong file định nghĩa các hàm thành viên của PhoneNumber, ta include thêm file PhoneNumber.h
Sau cùng là Include nó vào hàm Main. Chương trình sẽ chạy trơn tru
Một cách khác mới hơn, đơn giản hơn (nhưng cũng đòi hỏi trình biên dịch là Visual Studio 2005 trở lên)
Thêm dòng này vào đầu của file .h. Nó sẽ thông báo cho trình biên dịch chỉ include các thư viện 1 lần duy nhất.
4. Tách class thành file riêng
Để minh họa, tôi sẽ tạo một class MyInt đơn giản, dùng để biểu diễn số nguyên
Đầu tiên, khởi động Visual Studio
Chọn loại Project mong muốn, đặt tên cho nó và nhấn OK
Bấm Finish ở Wizard tạo Project
Sau đó, Visual Studio (VS)
sẽ tạo một project mới cho bạn, với tên bạn đặt và header đã được biên dịch sẵn là stdadx.h
Để thêm mới một class bằng cách thông thường, click phải vào Header Files, chọn Add > New Item…
Chọn Header File
Đặt tên cho nó và nhấn Add
Một file mới hoàn toàn có tên MyInt.h
được tạo ra. Đây là file dành cho việc khai báo class MyInt. Bạn cũng có thể định nghĩa class trong file này, nhưng việc đó không được khuyến cáo
// MyInt class declaration
class MyInt
{
private:
int data;
public:
MyInt();
MyInt(int);
};
Như bạn có thể thấy, chúng ta sử dụng kỹ thuật #pragma once
để tránh include quá nhiều thư viện Tương tự, hãy Add một file MyInt.cpp mới trong thư mục Source Files
Sau đó, hãy định nghĩa các thuộc tính và hàm của lớp MyInt
trong file MyInt.cpp
// MyInt class definition
using std::cin;
MyInt::MyInt()
: data(0)
{
}
MyInt::MyInt(int re)
: data(re)
{
}
Ở dòng 7, vì class MyInt
được khai báo ở file header MyInt.h
, nên bạn phải include nó vào để sử dụng.
Thế là xong. Có một cách khác để tạo class trong file riêng bằng Wizard của VS. Trong thư mục Header Files, click phải, chọn Add > Class…
Chọn CPP class rồi bấm Add
Trong Wizard mới hiện ra, bạn chỉ cần gõ tên class, tên file header và file source sẽ được tạo tự độn
Bấm Finish, ngay lập tức, 2 file mới sẽ được tạo, có sẵn code và được phân phối và thư mục tương ứn
Code tạo sẵn trong file header MyInt2.h
Code tạo sẵn trong file source MyInt2.cpp
Như vậy, tất cả công việc ta làm bằng tay đều được VS làm tự động, nhưng nó sinh ra một số code dư thừa. Nhiều lập trình viên không thích điều này, họ vẫn thích tự tạo class file cho mình hơn.
5. Về việc sử dụng Namespace
Như đã nói ở trên, lập trình hướng đối tượng với VC++ 2010, sinh viên thường #include
rất nhiều thư viện dư thừa, rồi sau đó using namespace std;
Điều đó không cần thiết. Trong namespace std
, tức STANDARD
, có rất nhiều hàm xây dựng sẵn mà bạn không cần dùng. Dùng hàm nào, bạn khai báo hàm đó. Ví dụ như hình trên, tôi dùng hàm cout
, cin
, endl
nên chỉ khai báo 3 hàm đó thôi.
std::cout;
using std::cin;
using std::endl;
using
3 hàm này nằm trong thư viện iostream Một số thư viện thường dùng:
stdafx.h
– tiêu chuẩn cho VC++ 2010iostream
– chứa các hàmcout
,cin
,endl
string
– chứa các hàm xử lý chuỗiiomanip
– chứa hàm định khoảng cho output (setw
,serfill
)conio.h
– chứa hàmgetch()
. Hàm này thường được dùng để dừng màn hình. Nhưng không nên sử dụng nó.