30/09/2018, 18:27

Làm sao để xuất dữ liệu từ lớp thành phần sang lớp bao trong lập trình hướng đối tượng trong C++?

câu hỏi như tiêu đề

viết 20:42 ngày 30/09/2018

ví dụ cụ thể đi. Ngôn ngữ nào nữa. Làm cái hàm get() là đủ rồi?

Nhuyngo Nhuyngo95 viết 20:37 ngày 30/09/2018

vd như chương trình này nè p

//lớp thành phần
 #pragma once
#include<iostream>
#include<string>
using namespace std;
class khoithi
{
public:
	string makhoi;
	float mon1,mon2,mon3,diemchuan;
	float tongdiem;
public:
	friend istream&operator>>(istream&is, khoithi &diem);
	friend ostream&operator<<(ostream&os,khoithi diem);
	float tongdiem()
	{
		return(mon1+mon2+mon3);
	}
	float diemchuan()
	{
	
	   return (diemchuan);
	}
	
};
#include "khoithi.h"


 istream& operator>>(istream&is, khoithi &diem)
{   
	cout<<"\n nhap ma khoi ";
	is>>diem.makhoi;
	cout<<"\n diem mon toan: ";
	is>>diem.mon1;
	cout<<"\nnhap diem hoa:";
	is>>diem.mon2;
	cout<<"\nnhap diem mon ly ";
	is>>diem.mon3;
	cout<<"\n nhap diem chuan ";
	is>>diem.diemchuan;
	diem.tongdiem=diem.mon1+diem.mon2+diem.mon3;
	return is;
}
 ostream&operator<<(ostream&os,khoithi diem)
 {
	 os<<"\n makhoi: "<<diem.makhoi<<"\ndiem mon toan: "<<diem.mon1<<"\ndiem mon ly: "<<diem.mon2<<"\ndiem mon hoa: "<<diem.mon3<<"\nnhap diem chuan:  "<<diem.diemchuan;
	 return os;
}
//lớp bao
#pragma once
#include "Cngay.h"
#include "KV.h"
#include "DT.h"
#include "khoithi.h"

class TS
{
private:
	string hoten;
	Cngay ngaysinh ;
	DT  doituong;
	KV khuvuc;
	khoithi diemchuan;
public:

	friend istream&operator>>(istream&is,TS &a);
	friend ostream&operator<<(ostream&os,TS a);
};


#include "TS.h"



istream&operator>>(istream&is, TS &a)
{
	fflush(stdin);
	cout<<"nhap ho va ten: ";
	getline(is,a.hoten);
	fflush(stdin);
	cout<<"nhap ngay sinh:";
	is>>a.ngaysinh;
	fflush(stdin);
	cout<<"nhap doi tuong du thi: ";
	is>>a.doituong;
	fflush(stdin);
	cout<<"khu vuc du thi: ";
	is>>a.khuvuc;
	cout<<"nhap diem chuan";
	is>>a.diemchuan;
	return is;
}
ostream&operator<<(ostream&os,TS a)
{  
	os<<"\nho ten thi sinh:"<<a.hoten<<"\nngay sinh:"<<a.ngaysinh<<"\ndoi tuong du thi:"<<a.doituong<<"\nkhu vuc du thi:"<<a.khuvuc<<"\ndiemchuan: "<<a.diemchuan;
return os;
}

Mình muốn lấy kết quả từ tổng điểm và điểm chuẩn từ lớp khối thi cho lớp TS thì làm sao bạn

viết 20:40 ngày 30/09/2018

gọi diemchuan.tongdiem() với diemchuan.diemchuan()

Nhuyngo Nhuyngo95 viết 20:41 ngày 30/09/2018

phải như ni không bạn
mình gán cho nó một biến trong lớp thí sinh tongdiem

a.tongdiem=a.diemchuan.tongdiem();
viết 20:34 ngày 30/09/2018

nếu cần lấy tổng điểm ra ngoài thì viết 1 cái hàm tongdiem() trong class ThiSinh, trả về diemchuan.tongdiem(), khỏi cần gán tongdiem vô 1 cái biến tạm làm gì nữa.

class ThiSinh
{
public:
    float tongdiem()const { return diemchuan.tongdiem(); }
};


//...
ThiSinh a;
//... gán giá trị cho a...

std::cout << a.tongdiem() << "\n"; //in ra tổng điểm của thí sinh a
Nhuyngo Nhuyngo95 viết 20:43 ngày 30/09/2018

vậy mình cần phải viết bên lớp khối thi rồi viết bên lớp THISINH luôn hả không có cách khác nek bạn
tổng diểm nằm trong lớp bao nha bạn

viết 20:40 ngày 30/09/2018

có thể viết 1 hàm getDiemchuan() trả về diemchuan:

class ThiSinh
{
public:
    const khoithi& getDiemchuan()const { return diemchuan; }
};

std::cout << a.getDiemchuan().tongdiem() << "\n";

sửa cái hàm tongdiem() trong khoithi lại, thên const vô phía sau nữa:
float tongdiem()const
float diemchuan()const

mà class khoithi sao lại có điểm 3 môn ở trỏng? Đáng lẽ phải tách ra thành class điểm thi mới đúng

Nhuyngo Nhuyngo95 viết 20:39 ngày 30/09/2018

tại sao phải thêm const vào vậy bạn?
class khoithi bao gồm diểm thi với khối thi à đề yêu cầu à

viết 20:31 ngày 30/09/2018

mấy hàm ko chỉnh sửa gì tới các biến trong class thì để const ở phía sau hết.

để lấy khoithi diemchuan trong class ThiSinh thì ta có thể trả về 1 bản copy của nó:
khoithi getDiemchuan()const;
nhưng như vậy tốn 1 lần copy, vậy nên trả về tham chiếu hay trả về đích thị diemchuan đó:
khoithi& getDiemchuan();
nhưng như vậy thì khi viết a.getDiemchuan() có thể viết thành a.getDiemchuan() = khoithi(...) như vậy là làm sai giá trị của a.diemchuan (vd 1 thí sinh xem điểm thi của mình có thể chỉnh sửa điểm thi luôn, như vậy là vô lý)
vì vậy phải trả về const&:
const khoithi& getDiemchuan()const;
nhưng trả về const vậy thì hàm tongdiem() ko xài được vì nó ko có const ở phía sau, tức là nó có thể thay đổi giá trị các biến trong object gọi nó, nên constant object ko thể gọi hàm tongdiem() được, nên phải thêm const vô phía sau.

Nhuyngo Nhuyngo95 viết 20:36 ngày 30/09/2018

bạn có thể giải thích rõ về việc dùng const trong này được không chứ mình không hiểu lắm

viết 20:43 ngày 30/09/2018

ta mới sửa lại rồi đó. Đơn giản là nếu ko có const thì

khoithi kt;
cin >> kt;
const khoithi* p = &kt;
const khoithi& r = kt;
p->tongdiem(); //ko gọi được
r.tongdiem(); //ko gọi được

trong khi hàm tongdiem() ko thay đổi giá trị gì của object gọi nó, nên p và r phải gọi được tongdiem() mới đúng.

Bài liên quan
0