–1 thích
915 đã xem
trong Kiến thức CNPM bởi (1.2k điểm)
Xin chào thầy cô và các bạn

Khi học về C++ em thấy có nhiều cách để gom nhiều hàm về chung 1 hàm. Để gom nhiều hàm khác nhau ở một số đoạn lệnh thì có cách nào không? Hay có cách gì mà trong lời gọi hàm của hàm này lại chứa hàm khác không?? ( Hàm này sẽ được chèn vào môt đoạn nào đó được đánh dấu trong hàm đã gọi nó).

Em cám ơn nhiều!
bởi (2.7k điểm)
Khi được học về con trỏ bạn sẽ được dạy về vấn đề này nhé (con trỏ hàm). Nói trước mất hay :p.
bởi (4.8k điểm)
Con trỏ hàm đâu phải là "gom nhiều hàm về chung 1 hàm" đâu bạn. Mà là sử dụng hàm thông qua con trỏ hàm được lưu địa chỉ hàm đó.
Thật sự thì mình không hiểu câu hỏi này đấy. Bạn đọc ở đâu mà "có nhiều cách để gom nhiều hàm về chung 1 hàm" vậy?
bởi (2.2k điểm)
Không hiểu câu hỏi lắm! Bạn cho ví dụ đi.
bởi (3.2k điểm)
đúng là không hiểu ý của bạn thiệt:
1. gọi làm này trong hàm khác mà đã biết trước hàm được gọi
2. gọi hàm này trong hàm khác mà chưa biết trước hàm được gọi
còn gì nữa không nhỉ :3
bởi (3.2k điểm)
nếu như theo câu: "gom nhiều hàm lại thành 1 hàm" thì mình nghĩ như vậy có đúng ý bạn không nhé:
ban đầu:
int main()
{
ham1();
ham2();
ham3();
//....
}
bây giờ viết thành:
int main()
{
ham(); // trong này gọi 3 hàm kia :v
//...
}
có phải vậy không bạn :v
bởi (4.8k điểm)
Trường hợp đầu bạn có 4 hàm tất cả (gồm cả main()), trường hợp sau, bạn có 5 hàm tất cả (gồm cả main()). Chả có gì "gom nhiều hàm về chung 1 hàm" ở đây.
bởi (1.2k điểm)
đã sửa bởi
ví dụ như
void HamTongQuat()
{
   //các câu lệnh....
  <điểm chèn một hoặc một số hàm phụ cần dùng>
   //các câu lệnh....
}
//định nghĩa các hàm con cần dùng.....
Khi cần dùng hàm thì gọi
HamTongQuat(....;"các hàm con cần chèn");
lúc đó các hàm con sẽ thay vào vị trí được đánh dấu trước rồi mới thực hiện HamTongQuat
bởi (2.7k điểm)
Con trỏ hàm á bạn. Từ từ rồi bạn cũng sẽ có mấy bài thực hành phải làm à.

3 Trả lời

0 k thích
bởi (1.2k điểm)
hiện lại bởi

Em xin lỗi, tại mới học nên dùng từ sai.

Ý em là các hàm trùng tên hoặc tham số hóa kiểu dữ liệu( thay cho gom nhiều hàm thành một hàm).

Còn em muốn hỏi về cách thay đổi cấu trúc của 1 hàm

Ví dụ như


void HamTongQuat()
{
   //các câu lệnh....
  <điểm chèn một hoặc một số hàm phụ cần dùng>
   //các câu lệnh....
}
//định nghĩa các hàm con cần dùng.....


Khi cần dùng hàm thì gọi
HamTongQuat(....;"các hàm con cần chèn");
lúc đó các hàm con sẽ thay vào vị trí được đánh dấu trước rồi mới thực hiện HamTongQuat

bởi (2.2k điểm)
Vẫn chưa hiểu câu hỏi là gì...

Mà lần sau thì ghi vào comment trên câu hỏi chứ đừng tạo thành câu trả lời nhé.
+2 k thích
bởi (4.8k điểm)

"hàm trùng tên" là tính năng function overloading (chồng hàm, trên lớp dạy từ này mà).

"tham số hóa kiểu dữ liệu" là tính năng function template (khuôn hàm, trên lớp cũng dạy từ này mà).

Cái ví dụ bạn đưa là con trỏ hàm. Đừng nóng vội, trên trường sẽ dạy ;) Nhưng theo kinh nghiệm bản thân và dao du trên các cộng đồng C/C++ thì function pointer rất hiếm khi được xài, vì ứng dụng của nó rất ít. Chẳng hạn bạn tham gia vào các project viết thư viện C/C++ (Boost chẳng hạn), thì bạn đôi khi phải viết các hàm/phương thức càng tổng quát càng tốt, kết hợp template và function pointer. Nhưng thực sự mình chưa thấy STL hay Boost dùng function pointer bao giờ ^^, chỉ toàn xài function object, như tham số thứ 3 của std::sort chẳng hạn để sắp xếp các object kiểu nào đó theo ý mình.
http://www.cplusplus.com/reference/algorithm/sort/

P.S: bạn có thể edit câu hỏi, đâu cần viết thành 1 câu "answer".

bởi (2.2k điểm)
function pointer mà ít dùng, ứng dụng ít??? Function pointer là sản phẩm của C, muốn thấy nó dùng thì mở mã C lên sẽ thấy nó dùng nhiều thế nào em ạ, đừng phán cái của C++ cho C. Boost hay STL vốn là template programming, kết hợp với đa hình + functor (mà đa hình được cài bằng function pointer) thì ít thấy function pointer thực sự.
bởi (4.8k điểm)
đã sửa bởi
Anh ví dụ cho em thử xem với những vấn đề nào dùng function pointer sẽ có ưu điểm hơn không dùng? Và số lượng những vấn đề đó có nhiều và thông dụng không?
bởi (2.2k điểm)
Việc tạo đối tượng hay đưa hàm vào lớp đối tượng gây tốn hao xử lý (overhead), hơn nữa trong trường hợp hạn hẹp trình biên dịch trên môi trường đích không hỗ trợ biên dịch những cơ chế nhất định của C++ (như trên các thiết bị nhúng), thì việc phải hạ xuống các khái niệm xử lý ở mức thấp hơn, đơn giản hơn như function pointer là đương nhiên. Hoặc hoàn toàn phải phát triển bằng C (không có C++) thì muốn linh động phải dùng function pointer. Tư tưởng hướng đối tượng là tư tưởng mô hình hóa chứ không phải thuần túy lập trình: người ta vẫn có thể suy nghĩ hướng đối tượng và cài đặt bằng C với function pointer.

Chúng ta quen làm việc với tài nguyên dư dả, chức năng thừa thãi nên chưa có cơ chội áp dụng những thứ như vậy, nhưng nên nhớ rằng mọi thứ đều có vai trò, vị trí, trường hợp áp dụng riêng của nó, chỉ là ta chưa thấy thôi.

Đơn giản là hãy đục code của thư viện ffmpeg (thư viện xử lý âm thanh và video trên nhiều môi trường đích) để xem con trỏ hàm được áp dụng triệt để thế nào.
bởi (4.8k điểm)
đã sửa bởi
Việc truyền function object (functor) có thể truyền bằng reference thì overhead cũng như function pointer (đều truyền vào địa chỉ cả). Và cho dù có truyền bằng value đi nữa, nếu class của functor không có các biến thành viên thì kích thước functor cũng chỉ ngang kích thước pointer. Nếu lập trình mà có cho phép xài C++, thì function pointer chả có ưu điểm gì hơn funtor cả (vốn linh động hơn, xử lý dựa trên thông tin biến thành viên, template,...).
Em đồng ý là trong môi trường buộc dùng C (không dùng C++ vì lý do nào đó) thì function pointer được dùng. Nhưng câu hỏi này hỏi ở khía cạnh C++ (C++ cũng hỗ trợ function pointer), thì em chưa thấy đoạn code nào xài function pointer cả => ứng dụng ít.
FFmpeg được viết thuần C nên chỉ xài function pointer là phải (đâu có cái nào khác có vai trò tương đương). Và cũng chả ai muốn viết lại toàn bộ FFmpeg thành C++ cả.
bởi (2.2k điểm)
Nên nhớ function pointer là stateless (trừ khi dùng kèm static) còn function object là stateful. Chuyện không đơn giản giữa có biến thành viên hay không có biến thành viên, khi mà compiler cần phải quản lý nhiều thông tin khác của đối tượng nên nó phải lưu trữ những thứ mà em không biết chắc được. Ngoài ra việc tạo object không có overhead chăng?

Ngoài ra ban đầu em nói là cộng đồng C/C++, sau lại nói khía cạnh C++, thế nghĩa là thế nào? ;) đọc lại câu này nhé "đừng phán cái của C++ cho C"
+1 thích
bởi (270 điểm)

Chào em,

Vấn đề mà em nói đến đúng là kỹ thuật sử dụng Con trỏ hàm. Kỹ thuật này em sẽ được tìm hiểu trong học kỳ 2, năm nhất, trong môn Kỹ thuật lập trình.

Thân.

Chào mừng đến với Q&A FIT. Bạn có thể đặt câu hỏi và nhận được câu trả lời từ các bộ phận hỗ trợ và những thành viên khác tại Khoa Công nghệ Thông tin, Trường Đại học Khoa học Tự nhiên, Đại học Quốc gia TP.HCM. Bạn hãy đăng nhập bằng tài khoản Google để gửi hoặc trả lời các câu hỏi.
...