好吧,在我的主,我有:
void somefunction();
int main()
{
//bla bla bla
SomeClass myclass = SomeClass();
void(*pointerfunc)() = somefunction;
myclass.addThingy(pointerfunc);
//then later i do
myclass.actionWithDiffrentOutcomes();
}
void somefunction()
{
//some code
}
而在类:
class SomeClass()
{
public:
void addThingy(void (*function)());
void actionWithDiffrentOutcomes();
private:
std::vector<void (**)()> vectoroffunctions;
}
SomeClass::addThingy(void (*function)())
{
vectoroffunctions.push_back(&function);
}
SomeClass::actionWithDiffrentOutcomes()
{
(*vectoroffunctions[0])();;
}
我还算新十岁上下的指针,但我读了我的C ++的书,Google搜索,分机。 这似乎是正确的,编译,运行,但是当我称之为“actionWithDiffrentOutcomes()”我得到一个访问冲突。 我不知道该怎么办。 它似乎是正确的,但事情显然是错误的。 因此,如何能我从一个类中调用函数时的定义是在另一个?
我做这种方式,因为我不能硬编码每个选项到一个switch语句。
你的代码几乎是正确的。 您的矢量被错误地持有指针指向函数而不是简单的函数指针。 addThingy
被添加的地址function
指针到vector
,但指针超出范围中的下一行。
更改您的代码如下:
//Store pointers to functions, rather than
//pointers to pointers to functions
std::vector<void (*)()> vectoroffunctions;
SomeClass::addThingy(void (*function)())
{
//Don't take the address of the address:
vectoroffunctions.push_back(function);
}
此外,你必须在代码应从甚至停止编译代码的其余很多语法错误。
问题就在这里:
vectoroffunctions.push_back(&function);
您要添加的局部变量的地址。 一旦你从函数返回局部变量被销毁。 该向量存储指向销毁的对象这就是为什么你在运行时得到“访问冲突”错误的地址。
为了解决这个问题,这样做:
首先改变这种
std::vector<void (**)()> vectoroffunctions;
为此:
std::vector<void (*)()> _functions; //vector of function-pointer-type
//I changed the name also!
这是因为几乎相同:
std::vector<void()> _functions; //vector of function-type
现在这样做:
_functions.push_back(function); //add copy!
为了使其更加灵活,你可以沿着使用模板std::function
为:
class A
{
public:
template<typename Function>
void add(Function && fn)
{
_functions.push_back(std::forward<Function>(fn));
}
void invoke_all()
{
for(auto && fn : _functions)
fn();
}
private:
std::vector<std::function<void()>> _functions;
};
现在你可以用它来存储功能,以及仿函数:
void myfunction() { std::cout << "myfunction" << std::endl ; }
struct myfunctor
{
void operator()() { std::cout << "myfunctor" << std::endl ; }
};
A a;
a.add(myfunction); //add function
a.add(myfunctor()); //add functor!
a.invoke_all();
输出( 在线演示 ):
myfunction
myfunctor
希望帮助。
函数指针是更易读与typedefs
:
typedef void (*RequiredFunction)();
然后,你可以声明addThingy()
是这样的:
void addThingy(RequiredFunction function);
而vectoroffunctions
像这样:
std::vector<RequiredFunction> vectoroffunctions;
的定义addThingy
将是:
void SomeClass::addThingy(RequiredFunction function)
{
vectoroffunctions.push_back(function);
}
和你main()
看起来更像是:
int main()
{
SomeClass sc;
RequiredFunction pointerfunc = somefunction;
sc.addThingy(pointerfunc);
sc.actionWithDiffrentOutcomes();
}
少得多*
S和&
s的这犯错误!
文章来源: C++ calling a function from a vector of function pointers inside a class where the function definition is in main