ارسال آدرس تابع از یک کلاس به تابع در کلاس دیگر
سلام - من دو تا کلاس دارم، میخوام آدرس یک تابع رو از کلاس1 به کلاس2 ارسال کنه ( این ارسال و دریافت آدرس توابع، تو تابع init دو کلاس فوق انجام میشه)، وقتی تابعی عضو کلاس1 نیست، به راحتی میتونم آدرسشو ارسال کنم ( یعنی فقط تو فایل class1.cpp تعریف شده و تو class.h تعریف نشده ) ولی اگه عضو کلاس باشه نمیتونم و حتما باید static تعریف کنم اون تابع رو تا مشکل حل بشه - ممنون میشم راهنمایی کنید.
نقل قول: ارسال آدرس تابع از یک کلاس به تابع در کلاس دیگر
نقل قول:
نوشته شده توسط
md3848
سلام - من دو تا کلاس دارم، میخوام آدرس یک تابع رو از کلاس1 به کلاس2 ارسال کنه ( این ارسال و دریافت آدرس توابع، تو تابع init دو کلاس فوق انجام میشه)، وقتی تابعی عضو کلاس1 نیست، به راحتی میتونم آدرسشو ارسال کنم ( یعنی فقط تو فایل class1.cpp تعریف شده و تو class.h تعریف نشده ) ولی اگه عضو کلاس باشه نمیتونم و حتما باید static تعریف کنم اون تابع رو تا مشکل حل بشه - ممنون میشم راهنمایی کنید.
سلام
این کار ، یعنی Pointers to members یک syntax خاصی داره :
https://docs.microsoft.com/en-us/cpp...s?view=vs-2017
https://www.ibm.com/support/knowledg...01/cplr034.htm
ولی چرا میخواید این کارا رو به این صورت انجام بدید ؟
روش های ساده تری داره:
در یک کلاس ، متغییری از نوع کلاس دوم تعریف کنید و اون تابع مورد نیاز رو در جای لازم صدا بزنید .
میتونید ادرس کلاس دوم رو به کلاس اول بفرستید.
طراحی برنامه تون نیاز به تغییر داره دوست عزیز .
نقل قول: ارسال آدرس تابع از یک کلاس به تابع در کلاس دیگر
نقل قول:
نوشته شده توسط
md3848
سلام - من دو تا کلاس دارم، میخوام آدرس یک تابع رو از کلاس1 به کلاس2 ارسال کنه ( این ارسال و دریافت آدرس توابع، تو تابع init دو کلاس فوق انجام میشه)، وقتی تابعی عضو کلاس1 نیست، به راحتی میتونم آدرسشو ارسال کنم ( یعنی فقط تو فایل class1.cpp تعریف شده و تو class.h تعریف نشده ) ولی اگه عضو کلاس باشه نمیتونم و حتما باید static تعریف کنم اون تابع رو تا مشکل حل بشه - ممنون میشم راهنمایی کنید.
#include <iostream>
#include <memory>
using namespace std;
class A {
public:
A(){}
~A(){}
void func(){
cout << "invoke function pointer!" << endl;
}
};
template<class T>
class Base{
public:
Base() : f(T::func){
}
~Base(){}
inline void invoke(){
((*fp).*f)();
}
private:
decltype(T::func) f ;
unique_ptr<T> fp ;
};
int main()
{
Base<A> base;
base.invoke();
return 0;
}