如何在 C++ 中的静态成员函数中使用指向成员函数的指针

how to use a pointer to member function inside a static member function in c++

我实际上是在尝试在静态函数中使用指针,该函数与我在指针中尝试使用的函数在同一 class 中。 我实际上被要求像这样使用 class :

class Factory {
    public:
        Factory() = default;
        ~Factory() = default;
        static IOperand* createOperand(eOperandType type, const std::string& value);
    private:
        IOperand* createInt8(const std::string& value);
        IOperand* createInt16(const std::string& value);
        IOperand* createInt32(const std::string& value);
        IOperand* createFloat(const std::string& value);
        IOperand* createDouble(const std::string& value);
        IOperand* createBigDecimal(const std::string& value);
};

如果这个函数不是静态的,我会这样做:

IOperand* Factory::createOperand(eOperandType type, const std::string& value)
{
    IOperand* (Factory::*ptr[6])(const std::string&) = {
            &Factory::createInt8,
            &Factory::createInt16,
            &Factory::createInt32,
            &Factory::createFloat,
            &Factory::createDouble,
            &Factory::createBigDecimal
    };
    return (*this.*ptr[type])(value);
}

ps: eOperandType 只是一个枚举

你需要知道应该调用其成员函数的对象在哪里。

你怎么知道的并不重要,关键是你必须以某种形式或方式知道它。也许指向对象的指针作为附加参数传递:

IOperand* Factory::createOperand(Factory *obj, eOperandType type, const std::string& value)
{
    IOperand* (Factory::*ptr[6])(const std::string&) = {
            &Factory::createInt8,
            &Factory::createInt16,
            &Factory::createInt32,
            &Factory::createFloat,
            &Factory::createDouble,
            &Factory::createBigDecimal
    };
    return ((*obj).*ptr[type])(value);
}

或者,也许传入了对对象的引用,而不是指针(导致对代码进行了轻微调整),或者对象可能完全在其他地方。也许 createOperand() 调用了一些其他函数 returns 一个指针或对其 class 实例的引用,但关键是成员函数不能被自身调用。需要一个对象,其成员函数被调用。这就是成员函数,以及它与普通函数的区别。

P.S。所有这些是否都在“静态成员函数内”并不重要。这不是一个因素。唯一的因素是,在非静态成员中,您始终可以使用 this 作为对象。但是没有法律要求您通过指针调用 this 的成员。如果你在某处有相同 class 的其他实例,你可以调用它的成员函数,而不是 this 一个的。

无论在什么地方使用成员函数指针调用方法,都需要一个对象来实现。在你的“如果这个函数不是静态的,我会怎么做”版本中,你调用了当前对象 this 上的方法。在静态方法中,你需要一个不同的Factory类型的对象,因为静态方法中没有this。我怀疑实际上 Factory 的所有方法都应该是 static,虽然没有触及它,但你可以这样做:

struct IOperand {};
class Factory {
    public:
        Factory() = default;
        ~Factory() = default;
        static IOperand* createOperand(size_t type, const std::string& value) {
            Factory f;
            IOperand* (Factory::*ptr[6])(const std::string&) = {
                &Factory::createInt8,
                &Factory::createInt16,
                &Factory::createInt32,
                &Factory::createFloat,
                &Factory::createDouble,
                &Factory::createBigDecimal
            };
            return (f.*ptr[type])(value);
        }
    private:
        IOperand* createInt8(const std::string& value);
        IOperand* createInt16(const std::string& value);
        IOperand* createInt32(const std::string& value);
        IOperand* createFloat(const std::string& value);
        IOperand* createDouble(const std::string& value);
        IOperand* createBigDecimal(const std::string& value);
};

谢谢大家的回答 我现在对这个主题和我的项目工作有了更好的了解。