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.

Mai Anh Dũng viết 19:58 ngày 30/09/2018

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?

Itachi Citus viết 19:42 ngày 30/09/2018

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.

Huy viết 19:55 ngày 30/09/2018

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.

Chi Ngo viết 19:43 ngày 30/09/2018

Dùng biến static thì sao nhỉ?

Huy viết 19:45 ngày 30/09/2018

Bạn programmerit có thể nói rõ hơn không?

Thanks bạn!

Chi Ngo viết 19:56 ngày 30/09/2018

Ý của mình là trong lớp Gen bạn khai báo như sau:

class Gen
{
      protected static int a, b;
}

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.

Huy viết 19:58 ngày 30/09/2018

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

class Gen
{
      public static int a, b;
}

Mai Anh Dũng viết 19:51 ngày 30/09/2018

Anh sửa lại thế này

#include <iostream>

using namespace std;

class Gen {
protected:
    static int a;
    static int b;
};

int Gen::a = 0;
int Gen::b = 0;

//-----------------------------
class AA : public Gen {
public:
    void edit_a(int x);
    void edit_b(int x);
    void print();
};

void AA::edit_a(int x) {
    Gen::a = x;
}

void AA::edit_b(int x) {
    Gen::a = x;
}

void AA::print() {
    cout << a << " " << b << endl;
}

int main() {
    AA objA, objB;

    objA.edit_a(10);
    objA.edit_b(15);
    
    objB.print();
    
    return 0;
}

Trả ra

15 0

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

int Gen::a = 0;
int Gen::b = 0;

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

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

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.

Huy viết 19:49 ngày 30/09/2018

int Gen::a = 0;
int Gen::b = 0;

Big Thanks Đạt! Tuyệt với các bonus rất chi tiết.

Huy viết 19:45 ngày 30/09/2018

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ì

class Gen {
protected:
    static int a;
    static int b;
};

int Gen::a = 0;
int Gen::b = 0;

Thì giờ mình cần

class Gen {
protected:
    static int A[30];
};

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?

Mai Anh Dũng viết 19:58 ngày 30/09/2018

À, 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

#include <iostream>

class Gen {
public:
    static void show() {
        for(int i = 0; i < 20; ++i)
        std::cout << Gen::ptrA[i];
    }
protected:
    static int * ptrA;
};

static int Gen_A[20] = {0};
int * Gen::ptrA = Gen_A;

int main() {
    Gen::show();
}
Huy viết 19:42 ngày 30/09/2018

Thank you very much!

Cảm thấy may mắn và hạnh phúc vì đc trợ giúp.

Bài liên quan
0