PDA

View Full Version : حرفه ای: کمک در ارسال یک متد از یک کلاس به متد دیگری از کلاس دیگر



2okeee
دوشنبه 16 آذر 1394, 18:15 عصر
سلام

من دو تا کلاس دارم به نام های Class_Equation و Class_Solver و میخواهم یک متد از کلاس Class_Equation را به کلاس Class_Solver ارسال کنم، در واقع خود متد میخواهم بفرستم نه مقادیر بازگشتی ان را ...

هر کاری میکنم خطا میده ، کسی میتواند کمک کند ؟؟؟


vector<double> Class_Equation::Equa_1(
double a,
vector<double> b)
{
vector<double> vn;

for (int i = 0; i < 5; i++)
{
vn.at(i) = a * b.at(i);
}

return vn;
}

vector<double> Class_Solver::Solver_1(
vector<double>(fc)(double, vector<double>),
double a,
vector<double> b)
{
vector<double> Result;

Result = fc(a, b);

return Result;
}


void main()
{
//.....

newh = Solver.Solver_1(Equation.Equa_1, 10, h);
}



اصل برنامه هم ضمیمه است ...
137306

negative60
دوشنبه 16 آذر 1394, 19:59 عصر
شما بدون اينکه کلاس رو بسازيد ميخواهيد از توابع اون استفاده کنيد اينطور نميتونيد به توابع کلاس های ديگه دسترسی داشته بشيد ميبايست متد Equa_1 رو تو هدر به سورت static تعريف کنيد

static vector<vector<double>> Equa_1(double a, vector<vector<double>> b);

و به اين صورت استفاده کنيد
Class_Solver Solver;
newh = Solver.Solver_1( Class_Equation::Equa_1(10, h) );

rahnema1
سه شنبه 17 آذر 1394, 00:17 صبح
سلام
می شه تابع عضو را فرستاد
تو این روش که استفاده کردم تابع Solver_1 به صورت زیر در میاد

template <typename F, typename T>
vector<vector<double>> Class_Solver::Solver_1(F fc, T equa, double a, vector<vector<double>> b)
{
vector<vector<double>> Result;
Result = std::mem_fn(fc)(equa,a, b);
return Result;
}

بعد تو فایل main باید فایل Class_Solver.cpp را مثل یک هدر include کنید و دیگه به عنوان سورس به حساب نمیاد و نباید مستقل کامپایل بشه
تو main هم به این صورت استفاده می کنید:

newh = Solver.Solver_1(Class_Equation::Equa_1, Equation, 10, h);

2okeee
چهارشنبه 18 آذر 1394, 20:52 عصر
شما بدون اينکه کلاس رو بسازيد ميخواهيد از توابع اون استفاده کنيد اينطور نميتونيد به توابع کلاس های ديگه دسترسی داشته بشيد ميبايست متد Equa_1 رو تو هدر به سورت static تعريف کنيد

static vector<vector<double>> Equa_1(double a, vector<vector<double>> b);

و به اين صورت استفاده کنيد
Class_Solver Solver;
newh = Solver.Solver_1( Class_Equation::Equa_1(10, h) );

سلام و تشکر به خاط پاسخ شما، اما متاسفانه این روش کار نکرد

2okeee
چهارشنبه 18 آذر 1394, 20:53 عصر
سلام
می شه تابع عضو را فرستاد
تو این روش که استفاده کردم تابع Solver_1 به صورت زیر در میاد

template <typename F, typename T>
vector<vector<double>> Class_Solver::Solver_1(F fc, T equa, double a, vector<vector<double>> b)
{
vector<vector<double>> Result;
Result = std::mem_fn(fc)(equa,a, b);
return Result;
}

بعد تو فایل main باید فایل Class_Solver.cpp را مثل یک هدر include کنید و دیگه به عنوان سورس به حساب نمیاد و نباید مستقل کامپایل بشه
تو main هم به این صورت استفاده می کنید:

newh = Solver.Solver_1(Class_Equation::Equa_1, Equation, 10, h);


سلام با تشکر از شما،

اما متاسفانه کد فوق خطا میدهد من هم نتوانستم خطا فوق را برطرف کنم !

متن خطا


Error 1 error C3867: 'Class_Equation::Equa_1': function call missing argument list; use '&Class_Equation::Equa_1' to create a pointer to member c:\users\Ali\a\main.cpp 32


کامپایلر مورد استفاده من هم VS2013 است، هرچند با TDM_GCC هم کامپایل نشد.137360

rahnema1
چهارشنبه 18 آذر 1394, 21:48 عصر
گفتم که نباید فایل Class_Solver.cpp جزء سورس باشه باید هدر باشه من با دستور زیر کامپایل می کنم (اگرچه برنامه شما در محاسباتی که در vector کردید باز هم ایراد داره)
g++ -std=c++1y main.cpp Class_Equation.cpp

توی ویژوال ++c هم خط زیر را به صورتی که نوشتم تغییر بدید درست می شه
newh = Solver.Solver_1(&Class_Equation::Equa_1, Equation, 10, h);

2okeee
پنج شنبه 19 آذر 1394, 11:49 صبح
گفتم که نباید فایل Class_Solver.cpp جزء سورس باشه باید هدر باشه من با دستور زیر کامپایل می کنم (اگرچه برنامه شما در محاسباتی که در vector کردید باز هم ایراد داره)
g++ -std=C++‎1y main.cpp Class_Equation.cpp

توی ویژوال ++c هم خط زیر را به صورتی که نوشتم تغییر بدید درست می شه
newh = Solver.Solver_1(&Class_Equation::Equa_1, Equation, 10, h);

سلام، متشکرم از این که راهنمایی کردید ..

درست شد