首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++成员函数指针

C++成员函数指针
EN

Stack Overflow用户
提问于 2015-01-05 02:51:47
回答 1查看 136关注 0票数 0

我真的需要帮助,在C++在大学的一个活动。我不知道怎么解决这个问题。有一个类具有这个成员函数:void Asteroid::render(),也是virtual,我必须以以下方式从另一个类调用这个函数。

我有一个包含许多小行星的模板列表,这是带有成员函数的类,模板具有传递应该调用的函数的函数。void for_each(void (*do_something)(T item));在这里,我必须在模板中传递指向void Asteroid::render() T的指针,它们是类Asteroid的对象。因此,第三个文件中的最后调用类似于这个asteroids.for_each(HERE_THE_FUNCTION_POINTER); asteroids,它是声明的List<Asteroid>,函数来自模板。

因此,我真的不知道如何解决这个问题,这是在最后一分钟:(我希望你能帮助我到目前为止。所有的QNA的我已经查过没有帮助,只是随机编译器错误。

PS:我不允许更改任何声明。

到目前为止谢谢。

方法调用:

代码语言:javascript
复制
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():

代码语言:javascript
复制
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;
    }
}
}

执行代码部分:

代码语言:javascript
复制
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());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-05 03:12:21

考虑签名:

代码语言:javascript
复制
template <typename T>
void List<T>::for_each(void(*do_something)(T item))

do_something这里是一个空函数,它接受一个T。但是您的render()不是一个自由函数,它是一个类方法。它的签名是void (Asteroid::*)(),它不匹配。我们需要的是一个中间的步骤。一些接受Asteroid*并在其上调用render()的函数:

代码语言:javascript
复制
void free_render(Asteroid* a) { a->render(); }

该函数匹配所需的签名(使用T = Asteroid*),并且可以传递到for_each中。

代码语言:javascript
复制
asteroids.for_each(free_render);

注意,您必须确保您使用的是List<Asteroid*> --如果render是一个虚拟方法,那么无论如何都应该这样做。

在C++11中,我们可以使用lambda代替:

代码语言:javascript
复制
void AsteroidField::render()
{
    asteroids.for_each(+[](Asteroid* a){ a->render(); }
    //                ^^^^
    // see: http://stackoverflow.com/questions/18889028/a-positive-lambda-what-sorcery-is-this
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27772798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档