从一个类的内部函数指针的向量C ++调用一个函数,其中函数定义是在主(C++ calling a f

2019-07-20 17:11发布

好吧,在我的主,我有:

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语句。

Answer 1:

你的代码几乎是正确的。 您的矢量被错误地持有指针指向函数而不是简单的函数指针。 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);
}

此外,你必须在代码应从甚至停止编译代码的其余很多语法错误。



Answer 2:

问题就在这里:

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

希望帮助。



Answer 3:

函数指针是更易读与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