Viết hàm đổi tên đối tượng học sinh

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;
}

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);
2 Likes

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

lại có vướng mắc rồi sư huynh ạ :frowning:
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

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 ...
3 Likes

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

Old topic

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