01/10/2018, 00:39

Class chứa class trong C++

#include <iostream>
#include <conio.h>

using namespace std;

class MangToaDo
{
public:
	int n;

	MangToaDo() 
	{
		n = 0;
	}

	class ToaDo
	{
	public:
		int x, y;

		ToaDo() {}
		ToaDo(int a, int b)
		{
			x = a;
			y = b;
		}
	};

	ToaDo mToaDo[10];

	void ThemToaDo(ToaDo td)
	{
		mToaDo[n] = td;
		n++;
	}
};

int main()
{
	MangToaDo mToaDo;
	ToaDo td(3, 2); //không truy cập được

	mToaDo.ThemToaDo(td);

	getch();
	return 0;
}

Trên đây là code của em về 2 class lồng nhau. Em muốn thực hiện được trong hàm main khai báo 1 ToaDo và thêm tọa độ đó vào trong Mảng Tọa Độ. Giả sử để public hết mà sao nó vẫn không có quyên truy cập đến class ToaDo ạ?
Sư huynh nào có thể giải đáp giúp em ạ!
Em xin chân thành cảm ơn.
Chúc các sư huynh 1 ngày code vui vẻ.

*grab popcorn* viết 02:47 ngày 01/10/2018

MangToaDo::ToaDo td(2, 3);
Nếu muốn là con trỏ thì

MangToaDo::ToaDo * td = new MangToaDo::ToaDo(2, 3);

Nguyễn Tuấn Nam viết 02:44 ngày 01/10/2018

Nhưng cái bài tập của em trong hàm main bắt buộc dùng câu lệnh ToaDo td(2, 3); :’((((

*grab popcorn* viết 02:41 ngày 01/10/2018

Nếu vậy thì mình thêm typedef vô trước hàm main nữa

typedef MangToaDo::ToaDo ToaDo;

Còn ko tạo cái class ToaDo bên ngoài luôn.

Nguyễn Tuấn Nam viết 02:51 ngày 01/10/2018

cảm ơn Sư huynh nhiều ạ :*
Cho em hỏi thêm xíu là cái typedef nó mang ý nghĩa là gì ạ?
Em xin chân thành cảm ơn.
Em làm phiền sư huynh quá

*grab popcorn* viết 02:55 ngày 01/10/2018

typedef có công dụng tạo tên giả cho một kiểu dữ liệu nào đấy.

Như bây giờ mình có con trỏ char = chuỗi (string)
thì thay vì mình ghi char * nhiều người ko hiểu or ngữ nghĩa nó ko tốt bằng, mình có thể tạo ra một tên giả khác cho nó bằng typedef

typedef char * string;

Nguyễn Tuấn Nam viết 02:39 ngày 01/10/2018

Thank sư huynh nhiều ạ

Nguyễn Tuấn Nam viết 02:51 ngày 01/10/2018

Sư huynh xem giúp em bài này với ạ.
Mục đích của em là khi gọi hs1.DoiTen(“Vy”); thì lập tức trong danh sách có hs1 sẽ đổi tên thành Vy.
Nhưng em không biết cách nào để có thể thay đổi ngay lập tức được. Em chỉ biết cách viết hàm cập nhật danh sách trong class LopHoc nhưng đề bài lại không cho phép @@~.

#include <iostream>
#include <conio.h>
#include <string>
#include <vector>

using namespace std;

class HocSinh
{
public:
	string ten;

	HocSinh(string tenHs)
	{
		ten = tenHs;
	}

	void DoiTen(string tenMoi)
	{
		ten = tenMoi;
	}
};

class LopHoc
{
public:
	string tenLop;
	vector <HocSinh> dshs;

	LopHoc(string lop)
	{
		tenLop = lop;
	}

	void ThemHocSinh(HocSinh hs)
	{
		dshs.push_back(hs);
	}

	void LietKeDanhSach()
	{
		cout << "Danh sach hoc sinh lop " << tenLop << endl;
		for(int i = 0; i < dshs.size(); i++)
			cout << dshs[i].ten << "\t";

		cout << endl;
	}
};

int main()
{
	HocSinh hs1("Thanh"), hs2("Dat"), hs3("Ngan"), hs4("Tu"), hs5("Truc");
	LopHoc lh1("A1");
	LopHoc lh2("D1");

	lh1.ThemHocSinh(hs1);
	lh1.ThemHocSinh(hs2);
	lh1.ThemHocSinh(hs3);
	lh2.ThemHocSinh(hs4);
	lh2.ThemHocSinh(hs5);

	lh1.LietKeDanhSach();
	lh2.LietKeDanhSach();

	hs1.DoiTen("Vy");

	lh1.LietKeDanhSach();
	
	

	

	getch();
	return 0;
}
*grab popcorn* viết 02:55 ngày 01/10/2018

Truyền vào một tham chiếu tới cái biến đó

Như mình mình dùng con trỏ

Sửa vector

vector <HocSinh *> dshs;

Sửa hàm thêm học sinh

void ThemHocSinh(HocSinh * hs)
	{
		dshs.push_back(hs);
	}

Và sửa một dòng trong LietKe…()

cout << dshs[i]->ten << "\t";

Và khi thêm ta làm như sau:

lh1.ThemHocSinh(&hs1);
Nguyễn Tuấn Nam viết 02:41 ngày 01/10/2018

cảm ơn sư huynh rất nhiều. em sửa được rồi ạ

Nguyễn Tuấn Nam viết 02:54 ngày 01/10/2018

lại có vướng mắc rồi sư huynh ạ
Em chia source code bài kia thành 3 file BaiLam.h BaiLam.cpp Main.cpp
Em muốn thực hiện hs1.ChuyenLop(lh2); thì lh1 chứa hs1 sẽ bị xóa đi và lh2 sẽ thêm hs1 vào lớp. Nhưng hàm lại chỉ có 1 biến truyền vào là lh2 vậy làm sao có thể xử lý xóa nó ở lh1 ạ :’( giúp em với ạ :((

BaiLam.h

#pragma once

#include <vector>
#include <string>

using namespace std;

class HocSinh
{
public:
	string ten;

	HocSinh(string tenHs);
	void DoiTen(string tenMoi);
	void ChuyenLop(class LopHoc &lopMoi);
};

class LopHoc
{
public:
	string tenLop;
	vector <HocSinh*> dshs;

	LopHoc(string lop);
	void ThemHocSinh(HocSinh *hs);
	void LietKeDanhSach();
};

BaiLam.cpp

#include <iostream>
#include <string>
#include <vector>
#include "BaiLam.h"

using namespace std;

HocSinh::HocSinh(string tenHs)
{
	ten = tenHs;
}

void HocSinh::DoiTen(string tenMoi)
{
	ten = tenMoi;
}

void HocSinh::ChuyenLop(class LopHoc &lopMoi)
{
	lopMoi.dshs.push_back(this);
}

LopHoc::LopHoc(string lop)
{
	tenLop = lop;
}

void LopHoc::ThemHocSinh(HocSinh *hs)
{
	dshs.push_back(hs);
}

void LopHoc::LietKeDanhSach()
{
	cout << "Danh sach hoc sinh lop " << tenLop << endl;
	for(int i = 0; i < dshs.size(); i++)
		cout << dshs[i]->ten << "\t";

	cout << endl;
}

Main.cpp

#include <iostream>
#include <conio.h>
#include "BaiLam.h"

using namespace std;



int main()
{
	HocSinh hs1("Thanh"), hs2("Dat"), hs3("Ngan"), hs4("Tu"), hs5("Truc");
	LopHoc lh1("A1");
	LopHoc lh2("D1");

	lh1.ThemHocSinh(&hs1);
	lh1.ThemHocSinh(&hs2);
	lh1.ThemHocSinh(&hs3);
	lh2.ThemHocSinh(&hs4);
	lh2.ThemHocSinh(&hs5);

	lh1.LietKeDanhSach();
	lh2.LietKeDanhSach();

	hs1.DoiTen("Vy");
	lh1.LietKeDanhSach();
	
	hs1.ChuyenLop(lh2);

	lh1.LietKeDanhSach();
	lh2.LietKeDanhSach();
	

	getch();
	return 0;
}

Em cảm ơn sư huynh nhiều ạ :3

*grab popcorn* viết 02:51 ngày 01/10/2018

Mình thì sẽ tạo thêm 1 biến chứa lớp mà học sinh đang học ngay tại cái class hocsinh luôn và thêm hàm addClass vào.

LopHoc * myClass;

Cứ mỗi lần add học sinh thì trong hàm add viết thêm như thế này:

dshs.push_back(hs);
hs->addClass(this);

Lúc cần xài thì

myClass->dshs.remove …

Nguyễn Tuấn Nam viết 02:51 ngày 01/10/2018

thank you sư huynh :v thành công mỹ mãn =)))

Bài liên quan
0