Sửa lỗi Undefined reference to

mọi người cho em hỏi sai đâu vậy?
code em đây
http://codepad.org/ftNYPMn3

#include <string>
#include <iostream>

using namespace std;

class NhomMau
{
	protected:
		string ten;
		string Nmau;
		bool Rh;
	public:
		void GetNmau(string& i);
		bool GetRh();
		void Xuat();
		void Nhap();
		virtual bool KtDiTruyen(NhomMau a, NhomMau b);
		virtual bool ChoMau(NhomMau a);
};

class NhomMauO :public NhomMau
{
	public:
		bool KtDiTruyen(NhomMau a, NhomMau b);
		bool ChoMau(NhomMau a);
};

class NhomMauA :public NhomMau
{
	public:
		bool KtDiTruyen(NhomMau a, NhomMau b);
		bool ChoMau(NhomMau a);
};

class NhomMauB :public NhomMau
{
	public:
		bool KtDiTruyen(NhomMau a, NhomMau b);
		bool ChoMau(NhomMau a);
};

class NhomMauAB :public NhomMau
{
	public:
		bool KtDiTruyen(NhomMau a, NhomMau b);
		bool ChoMau(NhomMau a);
};

class MangNhomMau
{
	private:
		NhomMau *arr[50];
		int N;
		int loai;
	public:
		void ChoMau();
		void KtDiTruyen();
		friend istream& operator>>(istream& is, MangNhomMau &x);
		~MangNhomMau()
		{
		for(int i=0;i<N;i++)
			delete arr[i];
		}
};



void NhomMau::Nhap()
{
	cin.ignore();
	cout << "Nhap ten:";
	getline(cin, ten);
	cout<<"Nhom mau: "<<Nmau;
	cout << "Nhom Rh(duong la 1, am la 0):";
	cin >> Rh;
}

void NhomMau::Xuat()
{
	cout << "Ho ten: " << ten << endl;
	cout << "Nhom mau: " << Nmau << endl;
	if (Rh == 1) cout << "Nhom Rh+" << endl;
	else cout << "Nhom Rh-" << endl;
}

bool NhomMau::GetRh()
{
	return Rh;
}

void NhomMau::GetNmau(string& i)
{
	i=Nmau;
}

bool NhomMauO::KtDiTruyen(NhomMau a, NhomMau b)
{
	string e,f;
	a.GetNmau(e);
	b.GetNmau(f);
	if(e=="AB" || f=="AB") return false;
	return true;
}

bool NhomMauA::KtDiTruyen(NhomMau a, NhomMau b)
{
	string e,f;
	a.GetNmau(e);
	b.GetNmau(f);
	if((e=="B" && f=="B") || (e=="O" && f=="O") || (e=="O" && f=="B") ||(e=="B" && f=="O") )return false;
	return true;
}

bool NhomMauB::KtDiTruyen(NhomMau a, NhomMau b)
{
	string e,f;
	a.GetNmau(e);
	b.GetNmau(f);
	if((e=="A" && f=="A") || (e=="O" && f=="O") || (e=="O" && f=="A") ||(e=="A" && f=="O")) return false;
	return true;
}

bool NhomMauAB::KtDiTruyen(NhomMau a, NhomMau b)
{
	string e,f;
	a.GetNmau(e);
	b.GetNmau(f);
	if(e=="O"|| f=="O")  return false;
	if((e=="A" && f=="A") || (e=="B" && f=="B")) return false;
	return true;
}

bool NhomMauO::ChoMau(NhomMau a)
{
	string e;
        a.GetNmau(e);
	if(Rh==false)
	{
		if(a.GetRh()==true) return false;
		else if(e!="O") return false;
		else return true;
	}
        else if(e!="O") return false;
	else return true;
}

bool NhomMauA::ChoMau(NhomMau a)
{
	string e;
        a.GetNmau(e);
	if(Rh==false)
	{
		if(a.GetRh()==true) return false;
		else if(e!="O" && e!="A") return false;
		else return true;
	}
	else if(e!="O" && e!="A") return false;
	else return true;
}


bool NhomMauB::ChoMau(NhomMau a)
{
	string e;
        a.GetNmau(e);
	if(Rh==false)
	{
		if(a.GetRh()==true) return false;
		else if(e!="O" && e!="B") return false;
		else return true;
	}
	else if(e!="O" && e!="B") return false;
	else return true;
}


bool NhomMauAB::ChoMau(NhomMau a)
{
	string e;
	if(Rh==false)
	{
		if(a.GetRh()==true) return false;
		else return true;
	}
	else return true;
}

istream& operator>>(istream& is, MangNhomMau &x)
{
	cout<<"Nhap so luong nguoi la: ";
	is>>x.N;
	for(int i=0;i<x.N;i++)
	{
		cout<<"Nhap loai nhom mau la: ";
		is>>x.loai;
		switch(x.loai)
		{
		case 1: x.arr[i] =  new NhomMauO();
			break;
		case 2: x.arr[i] = new NhomMauA();
			break;
		case 3: x.arr[i] = new NhomMauB();
			break;
		case 4: x.arr[i] = new NhomMauAB();
			break;
		}
		x.arr[i]->Nhap();			
	}
	return is;
}

void MangNhomMau::ChoMau()
{
	int t;
	cout<<"nhap vi tri nguoi can mau:";
	cin>>t;
	cout<<"nhung nguoi cho mau duoc nam o vi tri so:";
	for(int i=0;i<N;i++)
	{
		if(arr[t]->ChoMau(*arr[i])==true) cout<<i+1<<" ";
	}
	cout<<endl;
}

void MangNhomMau::KtDiTruyen()
{
	int e,f,g;
	cout<<"nhap ba vi tri can la:";
	cin>>e>>f>>g;
	if((arr[e]->KtDiTruyen(*arr[f],*arr[g]))==true) cout<<"ba nhom mau co tinh di truyen."<<endl;
	else cout<<"ba nhom mau ko co tinh di truyen."<<endl;
}

int main()
{
	MangNhomMau a;
	cin>>a;
	a.KtDiTruyen();
	a.ChoMau();
	return 0;
}

Thông tin lỗi đầy đủ đi bạn!!! Dòng nào? Tên tham chiếu?..

1 Like

undefined reference to vtable for NhomMau' undefined reference to vtable for NhomMau
nó ghi vậy á :((

		virtual bool KtDiTruyen(NhomMau a, NhomMau b);
		virtual bool ChoMau(NhomMau a);

do 2 hàm này chưa có định nghĩa nên class NhomMau là incomplete type nên trình dịch nó ko có định nghĩa cho class này nên nó bảo thiếu vtable cho class NhomMau.

sửa lại thêm định nghĩa { return false; } hoặc cho NhomMau thành pure virtual class = 0;

		virtual bool KtDiTruyen(NhomMau a, NhomMau b) { return false; }
		virtual bool ChoMau(NhomMau a) { return false; }

hoặc

		virtual bool KtDiTruyen(NhomMau a, NhomMau b) = 0;
		virtual bool ChoMau(NhomMau a) = 0;

mà code viết tầm bậy đáng lẽ phải truyền NhomMau& cho mọi hàm thì mới xài đa hình được còn code này có đa hình gì đâu mà virtual làm gì :skull:

à = 0 thì phải truyền NhomMau& hết, vậy là phải thêm { return false; } gì rồi

4 Likes

thanks ạ <3
chúc bạn nhiều sức khỏe

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?