Hỏi về OOP trong C++

  • Chào mọi người, cho mình hỏi có thể dùng 1 function để làm thuộc tính cho 1 class, C++ được ko? (Để có thể khởi tạo fuction đó bằng constructor).
  • Nếu có thì cú pháp như thế nào, mình có thử như code bên dưới nhưng ko được?
  • Và việc dùng function để làm thuộc tính có hạn chế gì cho code OOP trong C++ hay ko? (ví dụ như ảnh hưởng đến kế thừa, đa hình hay clean code sau này, …)

Mình xin cảm ơn, mong mọi người giúp đỡ?

vd:

class Soldier
{
public:
    int _age;
    void (*_misson)();
    Soldier(int age, void misson())
    { 
        _age = age;
        (*_misson)() = misson();
    }
}
  1. Được!
  2. Bạn viết sai nên không chạy được. Lỗi cú pháp.
  3. Mình không biết nó có gây vấn đề gì không, nhưng nó thực sự tiện lợi, ví dụ như dùng để tùy biến trong một số thuật toán sắp xếp hoặc xử lý sự kiện.

Giải thích thêm về ý 2:
Bạn viết sai cú pháp, chắc khi chạy trình biên dịch cũng có thông báo, không biết bạn có đọc và hiểu không.
Bạn khai báo thuộc tính đúng, nhưng khi khai báo trong tham số thì sai và gán cũng sai.
Khai báo tham số trong hàm dựng giống y hệt như khi khai báo thuộc tính thôi.
Ví dụ mẫu:

#include <iostream>

class Test{
    
    private:
    void (*func)(int);
    
    public:
    Test(void (*f)(int)){
        this->func = f;
    }
    
    void call(int v){
        func(v);
    }
};

void myF(int val){
    std::cout<<"My value is "<<val<<std::endl;
}

int main()
{
    Test* t = new Test(myF);
    t->call(369);

    return 0;
}

Chạy thử: https://onlinegdb.com/0_yc3-izOJ

4 Likes

Mình cảm ơn bạn rất nhiều.
-Bạn cho mình xin hỏi thêm là giữa 2 cú pháp dưới có gì khác biệt ko? (mình thử 2 hàm đó vào code của bạn thì đều in ra kết quả giống nhau là 369
-Với lại bạn cho mình xin key word hoặc link về chủ đề con trỏ hàm trong class với? Mình tìm trên mạng (cả tiếng Anh lẫn tiếng Việt) đều chưa ra trang web nào nói kỹ về vấn đề này. Mình cảm ơn bạn!

Test(void (*f)(int)) {
    this->func = f; 
}

    Test(void (f)(int)) {
        this->func = f;
    }

Bạn có thể đọc ở đây:



Khá thú vị đấy.

Con trỏ hàm C và C++ cơn bản cũng không khác nhau, thế nên bạn dùng với hàm (hướng chức năng) thế nào thì với các phương thức (hướng đối tượng) cũng tương tự.

2 Likes

Mở rộng ra một chút. Bên C++ thì người ta hay dùng std::function hơn là con trỏ hàm như bên trên, nó có cú pháp đẹp hơn và generic hơn con trỏ hàm.

Hơn nữa, bạn có thật sự cần phải lưu trữ lại hàm hay không? Nhu cầu này có vẻ không phổ biến, hay gặp nhất là dùng trong code kiểu callback hoặc là observer pattern (và 2 cái này thì đã có pattern/template sẵn để tham khảo).

Tuy nhiên, việc truyền một hàm vào làm tham số cho 1 hàm khác thì lại rất phổ biến (higher order function), trong trường hợp này thì hàm được truyền vào sẽ được gọi ngay mà không cần lưu lại làm gì, lúc này người ta hay dùng template như sau:

template<class F>
auto apply(F f, int data){
    return f(data);
}
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?