Wypros za C++
3 отговора
250 прегледа
Wypros za C++
imam golqm problem spe6no me interesuwa kak moga da si naprawq ukazatel kym funkcii na C++ trqbwa mi da e to4no kato na 4isto C poneve iskam da izwikwam dadena funkciq spored dadeno 4islo
na C towa koeto iskam izglevda taka:
typedef void (* LEVEL)(void);
void a(void)
{
printf("Level 1");
}
void b(void)
{
printf("Level 2");
}
LEVEL Levels[2] = {a, b};
....
// some function
Levels[1]();
Levels[0]();
Levels[0] = b;
Levels[0]();
Levels[1]();
....
nadqwam se me razbrahte kakwo to4no iskam da naprawq no C++ ne stawa
kato iskam 'some function' da e metod na sy6tiq klas na koito prinadlevat 'a' i 'b'
lesno e da pobedi6 viwota stiga da ima6 smelost da riskuwa6 wsi4ko
na C towa koeto iskam izglevda taka:
typedef void (* LEVEL)(void);
void a(void)
{
printf("Level 1");
}
void b(void)
{
printf("Level 2");
}
LEVEL Levels[2] = {a, b};
....
// some function
Levels[1]();
Levels[0]();
Levels[0] = b;
Levels[0]();
Levels[1]();
....
nadqwam se me razbrahte kakwo to4no iskam da naprawq no C++ ne stawa
kato iskam 'some function' da e metod na sy6tiq klas na koito prinadlevat 'a' i 'b'
lesno e da pobedi6 viwota stiga da ima6 smelost da riskuwa6 wsi4ko
Re: Wypros za C++
Eto edno re6enie na tvoq problem.
Bez proverkite i optimizaciite.
#include "stdafx.h"
#include <stdio.h>
class Base{public: virtual void f() = 0;};
class F1 : public Base{void f() {printf("Function 1\n");}};
class F2 : public Base{void f() {printf("Function 2\n");}};
class F3 : public Base{void f() {printf("Function 3\n");}};
class F4 : public Base{void f() {printf("Function 4\n");}};
class Work{
public:
Work(){
pBase[0] = new F1;
pBase[1] = new F2;
pBase[2] = new F3;
pBase[3] = new F4;
}
~Work(){
delete pBase[0];
delete pBase[1];
delete pBase[2];
delete pBase[3];
}
void Call(int n) {pBase[n - 1]->f();}
private:
Base* pBase[4];
};
int main(int argc, char* argv[])
{
Work p;
p.Call(1);// Nomer na funkciq
return 0;
}
Bez proverkite i optimizaciite.
#include "stdafx.h"
#include <stdio.h>
class Base{public: virtual void f() = 0;};
class F1 : public Base{void f() {printf("Function 1\n");}};
class F2 : public Base{void f() {printf("Function 2\n");}};
class F3 : public Base{void f() {printf("Function 3\n");}};
class F4 : public Base{void f() {printf("Function 4\n");}};
class Work{
public:
Work(){
pBase[0] = new F1;
pBase[1] = new F2;
pBase[2] = new F3;
pBase[3] = new F4;
}
~Work(){
delete pBase[0];
delete pBase[1];
delete pBase[2];
delete pBase[3];
}
void Call(int n) {pBase[n - 1]->f();}
private:
Base* pBase[4];
};
int main(int argc, char* argv[])
{
Work p;
p.Call(1);// Nomer na funkciq
return 0;
}
Re: Wypros za C++
#include <stdio.h>
class CTest;
typedef void (CTest::*LEVEL)(void);
class CTest
{
public:
void a(void)
{
printf("Level 1");
}
void b(void)
{
printf("Level 2");
}
void somefunc(void)
{
LEVEL Levels[2] = {&CTest::a, &CTest::b};
CTest* p = this;
(p->*Levels[0])();
(p->*Levels[1])();
Levels[0] = b;
(p->*Levels[0])();
(p->*Levels[1])();
}
};
void main()
{
CTest test;
LEVEL o = &CTest::a;
(test.*o)();
test.somefunc();
}
class CTest;
typedef void (CTest::*LEVEL)(void);
class CTest
{
public:
void a(void)
{
printf("Level 1");
}
void b(void)
{
printf("Level 2");
}
void somefunc(void)
{
LEVEL Levels[2] = {&CTest::a, &CTest::b};
CTest* p = this;
(p->*Levels[0])();
(p->*Levels[1])();
Levels[0] = b;
(p->*Levels[0])();
(p->*Levels[1])();
}
};
void main()
{
CTest test;
LEVEL o = &CTest::a;
(test.*o)();
test.somefunc();
}
Re: Wypros za C++
Не са много лоши идеите които ди дадоха, като изключим факта че, CObject за малко да даде пример с класицхеска грешка - но не няма я, може обачи ти като тръгнеш да си интерпретираш кода за твойте цели да я допуснеш - става дума за "Never treat arrays pollymorfically".
И така сега на въпроса.
Искаш да си имаш някакво ниво на абстракция при викането на определени членове на някои твой клас. И за целта си решил че *трябва* да стане със указаели към фунции :-) заинатил си се
. Указателите към фунции са добри неща, но са си стандартен похват във С. Във С++ е по-нормално за имплементираш Функтори - а именно клсове, които се държат като фунции.
Най-елементарния пример за имплементиране на функтор е:
class Functor{
Functor();
void operator() ();
virtual ~Functor();//пресполага се че ще искаш да го наследиш -
//затова виртуален дестрултор изобщо селия клас може да е
//напълно абстрактен;
};
може и обратно - да наследиш твоя клас със клас функтор и да имплементираш в него правилата за викане на дадени функции с числа - като при масив от указатели;
можеш и да оставиш фунцтора да нследява policy class, който да радава със задължителен интерфейс поведението, и дори върнатата стойност и параметри на oprator () (); na Functor.
Успех!

И така сега на въпроса.
Искаш да си имаш някакво ниво на абстракция при викането на определени членове на някои твой клас. И за целта си решил че *трябва* да стане със указаели към фунции :-) заинатил си се
Най-елементарния пример за имплементиране на функтор е:
class Functor{
Functor();
void operator() ();
virtual ~Functor();//пресполага се че ще искаш да го наследиш -
//затова виртуален дестрултор изобщо селия клас може да е
//напълно абстрактен;
};
може и обратно - да наследиш твоя клас със клас функтор и да имплементираш в него правилата за викане на дадени функции с числа - като при масив от указатели;
можеш и да оставиш фунцтора да нследява policy class, който да радава със задължителен интерфейс поведението, и дори върнатата стойност и параметри на oprator () (); na Functor.
Успех!