30/09/2018, 17:42
Làm cách nào để objB có thể nhận được các giá trị thay đổi của a và b mỗi khi objA thay đổi?
Chào mọi người.
Mình đang gặp vấn đề cần giải quyết ntn:
class Gen
{
int a, b;
}
//-----------------------------
class AA : public Gen
{
public:
void edit_a(int x);
void edit_b(int x);
}
void AA::edit_a(int x)
{
a = x
}
void AA::edit_b(int x)
{
b = x;
}
void main()
{
AA objA, objB;
objA.edit_a(10);
objA.edit_b(15);
cout<<objB.a <<" " << objB.b<<endl; //Mong muốn nhận được a, b đã đc thay đổi như biến toàn cục.
}
/////////////////////
Câu hỏi là/ Ý tưởng là: Làm cách nào để objB có thể nhận được các giá trị thay đổi của a và b mỗi khi objA thay đổi?
Hay có cách code nào để khi objA làm thay đổi các biến a, b thì objB cũng nhận được các giá trị đã thay đổi đó không?
Thanks mọi người.
Bài liên quan
Anh Huy có thể nói rõ hơn nhu cầu tại sao anh phải làm vậy được không?
Vấn đề của bác cũng nhiều người gặp phải, và người ta đúc lại thành một mẫu thiết, là mẫu Observer. Bạn xem ví dụ ở đây thử http://www.oodesign.com/observer-pattern.html
Trong trường hợp của bác thì Observer và Observable là một. Tuy nhiên mình không hiểu sao bác lại phải làm vậy.
Mục đích của mình là cần dùng cái biến a, b trong class Gen đó như biến toàn cục. Và khi các đối tượng làm thay đổi cái biến toàn cục này thì các đối tượng khác cũng đc sử dụng các giá trị đã bị thay đổi đó. Chương trình của mình nó cần kiểu đó để lập lịch.
Rất cảm ơn bạn Itachi_citus, có vẻ như đúng cái mình cần. Mình đang đọc, mặc dù chưa hiểu.
Dùng biến static thì sao nhỉ?
Bạn programmerit có thể nói rõ hơn không?
Thanks bạn!
Ý của mình là trong lớp Gen bạn khai báo như sau:
Lúc này, các các lớp con kế thừa tử lớp Gen sẽ chia sẻ chung các trường a, b. Lúc ấy, một đối tượng thay đổi các trường này thì giá trị của chúng ở các đối tượng khác cũng thay đổi theo. Biến static ở đây là dùng chung cho tất cả các đối tượng của lớp Gen và các lớp con của nó. Nhưng không khuyến khích cách làm này, cụ thể việc thay đổi trạng thái ở đối tượng này mà các đối tượng khác cũng thay đổi theo là rất nguy hiểm.
Xin lỗi nhưng sao mình thực hiện nó vẫn không được nhỉ, cho dù mình để nó là public
Anh sửa lại thế này
Trả ra
Khi sử dụng biến static trong class thì anh không thể khởi tạo bên trong class được, mà anh phải khởi tạo bên ngoài. Đây là chỗ em khởi tạo
Ngoài ra, nếu anh khai báo class ở file
.h
, thì anh phải khởi tạo giá trị của biến static ở file.cpp
Cái này nên dùng hàm callback thì hợp lý hơn. Khi gọi hàm tính toán xong thì gọi luôn hàm callback như thế ta không cần quan tâm khi nào giá trị của đối tượng objA thay đổi rồi gọi objB nữa mà nó tự gọi hàm của objB luôn. Ví dụ objA là quản lý thời kỳ gian, objB là quản lý việc hiển vi thị thời gian. Khi thời gian thay đổi thì nó gọi luôn hàm hiển vi thị để cập nhật.
Big Thanks Đạt! Tuyệt với các bonus rất chi tiết.
Chào mọi người,
Tình huống của mình giờ là thay vì một biến đơn như a, b thì giờ biến ấy là một mảng
vd thay vì
Thì giờ mình cần
Vấn đề giờ là giá trị khởi tạo cho mảng A này từ A[0] ~ A[29]
Gen::A[0] = 0;
Gen::A[1] = 0;
…
Gen::A[29] = 0;
Giờ đi khởi tạo thủ công bằng tay sao mọi người? Có cách nào khác không chỉ giùm mình với.
Thanks!
Hic,
Mà thủ công vậy cũng không được mọi người ạ, nó báo sai. Làm sao để khởi tạo giá trị ban đầu cho các phần tử mảng giờ mọi người ơi?
À, trường hợp này thì có 2 vấn đề, thứ nhất là static thì phải khởi tạo ở ngoài class. Trong khi muốn khởi tạo arrray thì phải khởi tạo ngay lúc định nghĩa nó.
Trong trường hợp này mình chữa cháy bằng cách tạo một con trỏ
static int * ptrA
, sau đó trong phần khởi tạo, mình gán con trỏ này cho một mảng static khác nằm ngoài class.Như ví dụ dưới
Thank you very much!
Cảm thấy may mắn và hạnh phúc vì đc trợ giúp.