我已经设法使用此代码创建“指向成员函数数组”,并且它工作正常......
typedef string (MyReportHelper::*reportFunctions)();
MyReportHelper helper;
void internalPointersTest(){
reportFunctions reportFunArray[] = {
&MyReportHelper::getVersion,
&MyReportHelper::getModel,
&MyReportHelper::getUsername,
};
int arrSize = sizeof(reportFunArray)/sizeof(reportFunArray[0]);
for(int i = 0; i < arrSize; i++){
string result = (helper.*reportFunArray[i])();
printf("%s", result);
}
}
但是,如果我将数组声明放在我的函数之外,就像下面的代码一样,我在Visual Studio中得到缓冲区溢出或访问冲突,但代码编译。
typedef string (MyReportHelper::*reportFunctions)();
MyReportHelper helper;
reportFunctions reportFunArray[] =
{
&MyReportHelper::getVersion,
&MyReportHelper::getModel,
&MyReportHelper::getUsername,
};
void internalPointersTest(){
int arrSize = sizeof(reportFunArray)/sizeof(reportFunArray[0]);
for(int i = 0; i < arrSize; i++)
{
//next line will fail
string result = (helper.*reportFunArray[i])();
printf("%s", result);
}
}
有谁知道如何解释为什么我需要将其保留在功能范围内?
答案 0 :(得分:2)
您没有使用i
索引数组。
其次,使用std::begin
和std::end
,他们已经为您处理了这个错误。
最后,PTMF基本上一文不值。使用std::function
。
编辑:
可能发生的事情是你翘起尺寸计算而VS恰好注意它是静止的。它在两个版本中都可能同样被打破。那是你的UB。
再次编辑:您将string
类型的对象传递给printf
?如果那个不是 const char*
的typedef,那么你好UB。如果它是 ...那么owch,这真的很糟糕。
答案 1 :(得分:0)
string result = (helper.*reportFunArray[i])();
printf("%s", result);
我认为string
实际上是std::string
?你在using namespace std;
某个地方吗?
在这种情况下,printf("%s", result);
很可能会崩溃,因为它会解释上帝知道什么是C风格字符串的第一个字符。以下是否有效?
string result = (helper.*reportFunArray[i])();
std::cout << result;