这个想法是根据表中的索引调用不同的函数。 但第27行产生运行时错误(( 我试图修复但没有成功((( 这是简化的代码:
#include <iostream>
void f1 (void) {
std::cout << "f1" << "\n";
}
void f2 (void) {
std::cout << "f2" << "\n";
}
typedef void (*fPtr[3])(void); // simple "[]" instead of "[3]" gets the compile error
class modeChanger {
public:
modeChanger (fPtr funcArray);
void op ();
private:
fPtr *_funcArray;
};
modeChanger::modeChanger (fPtr funcArray) {
_funcArray = (fPtr *) funcArray;
}
void modeChanger::op () {
(*_funcArray[0])();
(*_funcArray[1])(); // Line 27: this line generates a runtime error! Just comment it to get all work
}
void (*modeFuncArray[])(void) = {f1, f2, f2};
modeChanger *mode = new modeChanger (modeFuncArray);
int main() {
(*modeFuncArray[1])(); // Works fine
mode->op(); // generates a runtime error
return 0;
}
这很好用:
(*_funcArray[0])();
以及:
(*modeFuncArray[1])();
但这会产生运行时错误......
(*_funcArray[1])();
似乎由于某种原因,_funcArray的递增是不正确的。
答案 0 :(得分:3)
fPtr *_funcArray;
这是指向数组的指针,而不是指针数组。您在类型转换的帮助下抑制了警告。请参见下面的固定代码。
#include <iostream>
void f1 (void) {
std::cout << "f1" << "\n";
}
void f2 (void) {
std::cout << "f2" << "\n";
}
typedef void (*fPtr)(void);
class modeChanger {
public:
modeChanger (fPtr *funcArray);
void op ();
private:
fPtr *_funcArray;
};
modeChanger::modeChanger (fPtr *funcArray) {
_funcArray = funcArray;
}
void modeChanger::op () {
(*_funcArray[0])();
(*_funcArray[1])(); // Line 27: this line generates a runtime error! Just comment it to get all work
}
void (*modeFuncArray[])(void) = {f1, f2, f2};
modeChanger *mode = new modeChanger (modeFuncArray);
int main() {
(*modeFuncArray[1])(); // Works fine
mode->op(); // generates a runtime error
return 0;
}
答案 1 :(得分:2)
应用@ Someprogrammerdude的建议:
#include <iostream>
#include <array>
#include <functional>
void f1 (void) {
std::cout << "f1" << "\n";
}
void f2 (void) {
std::cout << "f2" << "\n";
}
using fPtr = std::function<void()>;
using fPtrs = std::array<fPtr, 3>;
class modeChanger {
public:
modeChanger (fPtrs funcArray);
void op ();
private:
fPtrs _funcArray;
};
modeChanger::modeChanger (fPtrs funcArray) : _funcArray(funcArray) { }
void modeChanger::op () {
_funcArray[0]();
_funcArray[1]();
}
int main() {
fPtrs modeFuncArray = {f1, f2, f2};
modeChanger mode(modeFuncArray);
modeFuncArray[1]();
mode.op();
return 0;
}
因此,而不是很难宣布&#34; C类型,我们有int
这样简单的事情,一切都很好。
答案 2 :(得分:0)
当你使用c ++时,你应该使用c ++特性而不是C,你应该使用<functional>
#include <iostream>
#include <functional>
void f1(void) {
std::cout << "f1" << "\n";
}
void f2(void) {
std::cout << "f2" << "\n";
}
typedef void(*fPtr[3])(void); // simple "[]" gets the compile error
class modeChanger {
public:
modeChanger(std::function<void(void)>* funcArray);
void op();
private:
std::function<void(void)> * _funcArray;
};
modeChanger::modeChanger(std::function<void(void)>* funcArray) {
_funcArray = funcArray;
}
void modeChanger::op() {
_funcArray[0]();
_funcArray[1](); // this line generates a runtime error! Just comment it to get all work
}
std::function<void(void)> modeFuncArray[] = { f1, f2, f2 };
modeChanger *mode = new modeChanger(modeFuncArray);
int main() {
modeFuncArray[1](); // Works fine
mode->op(); // generates a runtime error
return 0;
}