2

我已经设法用这段代码制作了一个“指向成员函数数组”,它工作正常......

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);
    }
}

有谁知道如何解释为什么我需要将其保留在函数范围内?

4

2 回答 2

2

您没有使用i.

其次,使用std::beginand std::end,他们已经为你处理了这个问题。

最后,PTMF 基本上一文不值。使用std::function.

编辑:

可能发生的情况是您错误地计算了大小,而 VS 仅在它是静态的时候才注意到。它可能在两个版本中都被破坏了。那是你的UB。

再次编辑:您将类型的对象传递stringprintf? 如果那不是的 typedef const char*,那么你好 UB。如果……那么,那真的很糟糕。

于 2013-03-01T20:38:56.083 回答
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;
于 2013-03-01T22:55:40.713 回答