C++ 成员函数指针
C++ Member-Function-Pointer
我真的需要帮助才能在大学进行 C++ 练习。我不知道如何解决它。
有一个 Class 具有此成员函数:void Asteroid::render()
也是 virtual
,我必须按以下方式从另一个 class 调用此函数。
我有一个包含许多小行星的模板列表,这是带有成员函数的class,模板有一个函数可以传递应该调用的函数。
void for_each(void (*do_something)(T item));
在这里我必须将指针传递给 void Asteroid::render()
T 在模板中是 class 小行星的对象。所以第三个文件中的最终调用看起来像这样 asteroids.for_each(HERE_THE_FUNCTION_POINTER);
asteroids
是声明的 List<Asteroid>
并且函数来自模板。
所以我真的不知道如何解决这个问题,而且它在最后一刻:(我希望你能帮助我到目前为止。我查找的所有 QNA 都没有帮助随机编译器错误。
PS:我不允许更改任何声明..
到目前为止谢谢。
调用方法:
void Asteroid::render()
{
// Compute transformation matrix
computeMatrix();
// Push matrix and set transformation and scaling
glPushMatrix();
glMultMatrixf(m_transformation);
glScalef(m_scale, m_scale, m_scale);
if(m_mesh)
{
m_mesh->render();
}
glPopMatrix();
}
应该调用 render() 的方法:
template <typename T>
void List<T>::for_each(void(*do_something)(T item))
{
Node* temp = this->m_list;
while (temp->next != NULL)
{
if (this->m_list->next != NULL)
{
do_something(temp->data);
temp = temp->next;
}
}
}
执行代码部分:
AsteroidField::AsteroidField(int quantity, string basePath) :
m_basePath(basePath)
{
// Generate asteroids
asteroids = List<Asteroid>();
Randomizer* random = Randomizer::instance();
for(int i = 0; i < quantity; i++)
{
TriangleMesh* mesh = TriangleMeshFactory::instance().getMesh(m_basePath + "asteroid.3ds");
float size = random->getRandomNumber(1,5);
Vertex<float> pos = random->getRandomVertex(5000);
Asteroid asteroid = Asteroid::Asteroid(mesh, pos, size);
asteroids.insert(asteroid);
}
}
AsteroidField::~AsteroidField()
{
asteroids.for_each(Asteroid::~Asteroid());
}
void AsteroidField::render()
{
// TODO: Call render for all asteroids
asteroids.for_each(*render());
}
考虑签名:
template <typename T>
void List<T>::for_each(void(*do_something)(T item))
do_something
这里是一个接受 T
的 void 函数。但是你的 render()
不是一个自由函数,它是一个 class 方法。它的签名是void (Asteroid::*)()
,不匹配。我们需要的是一个中间步骤。一些接受 Asteroid*
并在其上调用 render()
的函数:
void free_render(Asteroid* a) { a->render(); }
该函数匹配所需的签名(带有 T = Asteroid*
),您可以将其传递给 for_each
:
asteroids.for_each(free_render);
请注意,您必须确保您使用的是 List<Asteroid*>
- 如果 render
是虚方法,您无论如何都应该这样做。
在 C++11 中,我们可以使用 lambda 代替:
void AsteroidField::render()
{
asteroids.for_each(+[](Asteroid* a){ a->render(); }
// ^^^^
// see:
}
我真的需要帮助才能在大学进行 C++ 练习。我不知道如何解决它。
有一个 Class 具有此成员函数:void Asteroid::render()
也是 virtual
,我必须按以下方式从另一个 class 调用此函数。
我有一个包含许多小行星的模板列表,这是带有成员函数的class,模板有一个函数可以传递应该调用的函数。
void for_each(void (*do_something)(T item));
在这里我必须将指针传递给 void Asteroid::render()
T 在模板中是 class 小行星的对象。所以第三个文件中的最终调用看起来像这样 asteroids.for_each(HERE_THE_FUNCTION_POINTER);
asteroids
是声明的 List<Asteroid>
并且函数来自模板。
所以我真的不知道如何解决这个问题,而且它在最后一刻:(我希望你能帮助我到目前为止。我查找的所有 QNA 都没有帮助随机编译器错误。
PS:我不允许更改任何声明..
到目前为止谢谢。
调用方法:
void Asteroid::render()
{
// Compute transformation matrix
computeMatrix();
// Push matrix and set transformation and scaling
glPushMatrix();
glMultMatrixf(m_transformation);
glScalef(m_scale, m_scale, m_scale);
if(m_mesh)
{
m_mesh->render();
}
glPopMatrix();
}
应该调用 render() 的方法:
template <typename T>
void List<T>::for_each(void(*do_something)(T item))
{
Node* temp = this->m_list;
while (temp->next != NULL)
{
if (this->m_list->next != NULL)
{
do_something(temp->data);
temp = temp->next;
}
}
}
执行代码部分:
AsteroidField::AsteroidField(int quantity, string basePath) :
m_basePath(basePath)
{
// Generate asteroids
asteroids = List<Asteroid>();
Randomizer* random = Randomizer::instance();
for(int i = 0; i < quantity; i++)
{
TriangleMesh* mesh = TriangleMeshFactory::instance().getMesh(m_basePath + "asteroid.3ds");
float size = random->getRandomNumber(1,5);
Vertex<float> pos = random->getRandomVertex(5000);
Asteroid asteroid = Asteroid::Asteroid(mesh, pos, size);
asteroids.insert(asteroid);
}
}
AsteroidField::~AsteroidField()
{
asteroids.for_each(Asteroid::~Asteroid());
}
void AsteroidField::render()
{
// TODO: Call render for all asteroids
asteroids.for_each(*render());
}
考虑签名:
template <typename T>
void List<T>::for_each(void(*do_something)(T item))
do_something
这里是一个接受 T
的 void 函数。但是你的 render()
不是一个自由函数,它是一个 class 方法。它的签名是void (Asteroid::*)()
,不匹配。我们需要的是一个中间步骤。一些接受 Asteroid*
并在其上调用 render()
的函数:
void free_render(Asteroid* a) { a->render(); }
该函数匹配所需的签名(带有 T = Asteroid*
),您可以将其传递给 for_each
:
asteroids.for_each(free_render);
请注意,您必须确保您使用的是 List<Asteroid*>
- 如果 render
是虚方法,您无论如何都应该这样做。
在 C++11 中,我们可以使用 lambda 代替:
void AsteroidField::render()
{
asteroids.for_each(+[](Asteroid* a){ a->render(); }
// ^^^^
// see:
}