30/09/2018, 17:01

Cách tách code ra thành file .cpp và file .h?

cho e hỏi chút ạ, e có 1 file declaration.h để khai báo 1 namespace chứa class có các phương thức và thuộc tính abcxyz gì đó, rồi e lại tạo 1 file definition.h để định nghĩa các phương thức cho class đó có đc ko ạ?

Còn file main.cpp thì e include 2 file kia vào để dùng như bình thường ạ. Tất nhiên là trong definition.h e cũng include declaration.h.

Chương trình chạy ổn nhưng e ko biết làm thế có đúng ko nữa, nên lên đây hỏi ý kiến mọi người

... viết 19:07 ngày 30/09/2018

Chương trình chạy được là được.
Nhưng để người khác nhìn vô dễ hiểu thì định nghĩa trong declaration.h thì nên thực thi trong declaration.cpp. Như thế người ta dễ tìm hơn.

Nguyễn Minh Dũng viết 19:08 ngày 30/09/2018

Không được đâu. Việc định nghĩa phải cho vào file .cpp. Khi inlude file .h mình mong đợi là mình đang inlude các khai báo chứ không phải định nghĩa.

Lý do là vì khi include định nghĩa sẽ làm code phình to ra. Khi mình include có nghĩa là mình kéo đoạn code trong file include về file hiện tại. Nếu trong file include toàn là định nghĩa thì mình sẽ có một file mới có toàn là định nghĩa của code từ file khác.

Việc compile trong C và C++ chia ra làm hai phần là để tránh việc include định nghĩa.

Các ngôn ngữ như Java và C# thì có giải pháp khác để include nên không có file header.

Sáng Béo viết 19:17 ngày 30/09/2018

nếu không include file định nghĩa thì main nó lại báo undefined a ạ

Nguyễn Minh Dũng viết 19:12 ngày 30/09/2018

Em phải include file khai báo chứ? Nói như vậy thì có vẻ em quên mất căn bản về include file .h rồi

Sáng Béo viết 19:06 ngày 30/09/2018

bọn e chưa đc học tách file mà a.
thế a có thể nói ngắn gọn cách tách file đc ko ạ?
ví dụ: file khai báo chỉ khai báo, file định nghĩa include file khai báo và chứa các định nghĩa. file main include …

Nguyễn Minh Dũng viết 19:05 ngày 30/09/2018

Em phải có một file .cpp để chứa định nghĩa và một file .h để chứa prototype. Ví dụ em có file code.cpp thì sẽ có một file khác là code.h

Trong file code.cpp ta sẽ include file code.h
Trong file code.h ta sẽ có prototype của file code.cpp
trong file code.cpp ta sẽ có định nghĩa của các hàm
trong file main.cpp ta sẽ include file code.h

Sáng Béo viết 19:09 ngày 30/09/2018

file Array.h của e như sau:

#ifndef _ARRAY_H
#define _ARRAY_H

namespace arr{
	template<class T>
	class Array{
		private:
			int size;
			T* a;
		public:
			Array<T>();
			Array<T>(int max);
			~Array<T>();
			T& operator[](int index);
			T& operator=(const T& a2);
			void set(int index, T val);
			void Display();
			int GetSize();
			void Sort();
			T Max();
	};
}

#endif

File Array.cpp như sau:

#ifndef _ARRAY_CPP
#define _ARRAY_CPP

#include <iostream>
#include "Array.h"
using namespace std;
using namespace arr;

template<class T>
Array<T>::Array(){
	size=0;
	a=new T[0];
}

template<class T>
Array<T>::Array(int max){
	size=max;
	a=new T[size];
}

template<class T>
Array<T>::~Array(){
	size=0;
	delete[] a;
}

template<class T>
T& Array<T>::operator[](int index){
	try{
		if(index>=0 && index <size)
			return a[index];
		else
			throw(index);
	} catch(int e){
		if(e<0)
			cout<<"index < 0\n";
		else
			cout<<"index >= "<<size<<endl;
	}
}

template<class T>
T& Array<T>::operator=(const T& a2){
	for(int i=0;i<a2.GetSize();i++) set(i,a2[i]);
	return *this;
}

template<class T>
void Array<T>::set(int index, T val){
	a[index]=val;
}

template<class T>
void Array<T>::Display(){
	for(int i=0;i<size;i++)
		cout<<a[i]<<" ";
	cout<<endl;
}

template<class T>
int Array<T>::GetSize(){
	return size;
}

template<class T>
void Array<T>::Sort(){ //Sap xep mang theo thu tu tang dan
	for(int i=0;i<size-1;i++)
		for(int j=i+1;j<size;j++)
			if(a[i]>a[j]){
				T tmp=a[i];
				a[i]=a[j];
				a[j]=tmp;
			}
}

template<class T>
T Array<T>::Max(){
	T m=a[0];
	for(int i=1;i<size;i++)
		if(a[i]>m) m=a[i];
	return m;
}

#endif

Còn file main.cpp như sau:

#include <iostream>
#include "Array.h"
using namespace std;
using namespace arr;

int main(){
	int n=0;
	cout<<"Nhap so phan tu: ";
	cin>>n;
	Array<int> a(n);
	for(int i=0;i<n;i++){
		int tmp;
		cout<<"a["<<i+1<<"]=";
		cin>>tmp;
		a.set(i,tmp);
	}
	cout<<"Mang vua nhap:\n";
	a.Display();
	cout<<"Kich thuoc mang: "<<a.GetSize()<<endl;
	cout<<"Phan tu lon nhat: "<<a.Max()<<endl;
	a.Sort(); //Sap xep mang
	cout<<"Mang sau khi sap xep:\n";
	a.Display();
	Array<int> b;
	b=a; //Sao chep mang.
	cout<<"Mang b sao chep tu mang a:\n";
	b.Display();
	return 0;
}

A thấy e include sai không ạ?
e compile main nó cứ báo mấy cái undefined

Nguyễn Minh Dũng viết 19:02 ngày 30/09/2018

Nó bào cái gì undefined? Kiểm tra xem file .cpp và file .h và file main có nằm chung thư mục không?

Sáng Béo viết 19:07 ngày 30/09/2018

nó undefined mấy cái của file Array.h đó a.
tất cả cùng thư mục rồi mà

... viết 19:12 ngày 30/09/2018

Hồi trước mình cũng bị kiểu undefined với template này một lần. Hình như hồi đó mình fix bằng cách tạo 1 project bằng code block rồi code lại như trên (không tạo riêng rẽ từng file). Cũng không nhớ có phải vậy không.

Sáng Béo viết 19:12 ngày 30/09/2018

a @ltd giúp e với

Nguyễn Minh Dũng viết 19:02 ngày 30/09/2018

Trường hợp này thì có lẽ là do phần khai báo template của em bị lỗi. Bây giờ em thử làm lại từ đầu không có template, không có gì cả. Chỉ có class Array cực kỳ đơn giản include đúng như thế này xem?

Sáng Béo viết 19:03 ngày 30/09/2018

không được a ạ
e làm 3 file sau:
testTachFile.h

#ifndef test_h
#define test_h

class test{
	public:
		void Display();
	private:
		int x;
};

#endif

testTachFile.cpp

#include <iostream>
#include "testTachFile.h"
using namespace std;

void test::Display(){
	x=3;
	cout<<x<<endl;
}

main.cpp

#include <iostream>
#include "testTachFile.h"
using namespace std;

int main(){
	test a;
	a.Display();
	return 0;
}
Nguyễn Minh Dũng viết 19:09 ngày 30/09/2018

Của anh chạy ok mà


-------------- Build: Debug in cppproject (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -g -Weffc++ -std=c++98 -Wextra -Wall  -c E:\workspace\codeblocks\cppproject\array.cpp -o obj\Debug\array.o
mingw32-g++.exe -Wall -g -Weffc++ -std=c++98 -Wextra -Wall  -c E:\workspace\codeblocks\cppproject\main.cpp -o obj\Debug\main.o
mingw32-g++.exe  -o bin\Debug\cppproject.exe obj\Debug\array.o obj\Debug\main.o   
Output file is bin\Debug\cppproject.exe with size 952.49 KB
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))

Anh đổi ten file thành array.h

Sáng Béo viết 19:05 ngày 30/09/2018

hay tại Dev C++ không hỗ trợ nhỉ?

Nguyễn Minh Dũng viết 19:02 ngày 30/09/2018

Anh không nghĩ thế Em thử tạo một project mới hoàn toàn xem sao?

Sáng Béo viết 19:03 ngày 30/09/2018

không đc a ơi
e tạo project mới xong tạo 3 file như thế mà nó ko chạy

Nguyễn Minh Dũng viết 19:07 ngày 30/09/2018

Hmm, anh không dùng DevC nên khó giúp quá, nhưng anh khá chắc chắn là DevC vẫn có thể hỗ trợ được bình thường

Sáng Béo viết 19:13 ngày 30/09/2018

hiu hiu, buồn ghê gớm, a có teamviewer ko? xem giúp e.


với lại a xem giúp e chỗ try catch với, hình như e làm ko đúng

Bài liên quan
0