如何在 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);
};
谢谢大家的回答
我现在对这个主题和我的项目工作有了更好的了解。
我实际上是在尝试在静态函数中使用指针,该函数与我在指针中尝试使用的函数在同一 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);
};
谢谢大家的回答 我现在对这个主题和我的项目工作有了更好的了解。