[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

#include "stdafx.h"
#include "iostream"
using namespace std;

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:

#ifndef TÊNCLASS_H
#define TÊNCLASS_H

các thư viện cần thiết

các dòng lệnh

#endif

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

04-11-2011 7-41-49 PM

Khai báo tên class trong PhoneNumber.h

04-11-2011 7-44-18 PM

Sau đó, trong file định nghĩa các hàm thành viên của PhoneNumber, ta include thêm file PhoneNumber.h

04-11-2011 7-45-44 PM

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)

#pragma once

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

04-01-2012 10-57-58 AM

Chọn loại Project mong muốn, đặt tên cho nó và nhấn OK

04-01-2012 10-59-17 AM

Bấm Finish ở Wizard tạo Project

04-01-2012 11-04-33 AM

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

04-01-2012 11-08-05 AM

Để 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…

04-01-2012 11-11-10 AM

Chọn Header File

04-01-2012 11-12-04 AM

Đặt tên cho nó và nhấn Add

04-01-2012 11-12-53 AM

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

#prama once

#include "stdafx.h"

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

04-01-2012 11-18-01 AM

04-01-2012 11-18-17 AM

04-01-2012 11-18-38 AM

04-01-2012 11-19-08 AM

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

#include "stdafx.h"
#include "iostream"
using std::cin;

#include "MyInt.h"

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…

04-01-2012 11-27-20 AM

Chọn CPP class rồi bấm Add

04-01-2012 11-28-47 AM

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

04-01-2012 11-29-46 AM

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

04-01-2012 11-33-11 AM

Code tạo sẵn trong file header MyInt2.h

04-01-2012 11-32-08 AM

Code tạo sẵn trong file source MyInt2.cpp

04-01-2012 11-35-12 AM

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.

#include "stdafx.h"
#include "iostream"
using std::cout;
using std::cin;
using std::endl;

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++ 2010
  • iostream – chứa các hàm cout, cin, endl
  • string – chứa các hàm xử lý chuỗi
  • iomanip – chứa hàm định khoảng cho output (setw, serfill)
  • conio.h – chứa hàm getch(). 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ó.