Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   v-table index (http://www.velocityreviews.com/forums/t748750-v-table-index.html)

Alexander Zezulinsky 05-21-2011 05:24 PM

v-table index
 
Hi, everyone

I can operate with pointer-to-member functions.
How can I get virtual member function index from v-table?
I would like to iterate v-table and to execute virtual method by v-
table index.

Is it possible?

CODE:
----------------------------------------------------------------------------------------
class ICollection
{
public:
virtual void SystemMethod_0() = 0;
virtual void SystemMethod_1() = 0;
virtual void SystemMethod_2() = 0;
virtual void SystemMethod_3() = 0;

/* pointer-to-member */
typedef void (ICollection::*fnMethod)();

/* get pointer-to-member by id */
virtual ICollection::fnMethod getMethodPtr(size_t nIndex) = 0;

/* ctor and virtual dtor */
ICollection() {}
virtual ~ICollection() {}
};

class CTest: public ICollection
{
public:
virtual void SystemMethod_0() {printf("SystemMethod_0");}
virtual void SystemMethod_1() {printf("SystemMethod_1");}
virtual void SystemMethod_2() {printf("SystemMethod_2");}
virtual void SystemMethod_3() {printf("SystemMethod_3");}

virtual ICollection::fnMethod getMethodPtr(size_t nIndex)
{
ICollection::fnMethod fnAction = NULL;
switch(nIndex)
{
case 0: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_0;brea k;
case 1: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_1;brea k;
case 2: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_2;brea k;
case 3: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_3;brea k;
default: assert(false);break;
}
return fnAction;
}

/* ctor and dtor */
CTest() {}
~CTest() {}
};

/* usage */
int main(int argc, const char* argv[])
{
ICollection* pCollection = new CTest();

ICollection::fnMethod fnAction = NULL;
for (size_t nIndex=0; nIndex!=4; ++nIndex)
{
/* I would like to get v-table index and execute method by v-table
index */
/* But I can operate only with pointer-to-memeber like
this */
fnAction = pCollection->getMethodPtr(nIndex);
(pCollection->*fnAction)();
}

delete pCollection;

return 0;
}
----------------------------------------------------------------------------------------

Thank you for helping me!

Vaclav Haisman 05-21-2011 06:13 PM

Re: v-table index
 
Alexander Zezulinsky wrote, On 21.5.2011 19:24:
> Hi, everyone
>
> I can operate with pointer-to-member functions.
> How can I get virtual member function index from v-table?
> I would like to iterate v-table and to execute virtual method by v-
> table index.
>
> Is it possible?

It is not. Instead, gather the member function pointers into your own array
and index into such array, if you really need to. Alternativelly, rethink
your design so that you do not need such thing at all.

>
> CODE:
>[...]


--
VH


All times are GMT. The time now is 07:16 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.