在没有实例化对象的情况下访问非静态成员函数?

时间:2016-05-08 23:02:46

标签: c++ syntax

我有一个编程任务,提供驱动程序以及必须使用的方法头。问题是该方法是一个成员函数,并且驱动程序不会实例化函数类的对象来调用该函数。

功能标题:

template <class Comparable>
void mergesortImproved( vector<Comparable> &a ) { //solution here }

驱动程序(单独文件)调用mergesortImproved:

mergesortImproved( items );

我们不允许提交修改过的驱动程序,因此看起来这应该可行。我错过了什么,或者这只是一个草率的任务?

1 个答案:

答案 0 :(得分:1)

简单回答:这是不可能的。如果没有关联的对象实例,则无法调用非静态成员函数。任何非静态函数都隐含地具有必须传递的附加参数(例如,对o->f(10, 12)的调用被隐含地转换为类似_f(o, 10, 12)的内容;如果感兴趣,请查看calling conventions

静态成员函数仍然必须通过classname::function()调用,所以再次 - 运气不好。

但是:你可以在标题中放置一个全局函数,它会实例化对象并调用对象成员函数:

* H:

class X
{
    template <class Comparable>
    void mergesortImproved( vector<Comparable> &a )
    {
        /* ... */
    }
}

template <class Comparable>
void mergesortImproved( vector<Comparable> &a )
{
    X x;
    x.mergesortImproved(a);
}