构造函数

时间:2016-03-04 15:21:13

标签: c++

我尝试将std :: shared_pointer与删除器一起使用。我试图使用成员函数作为删除器。但它无法编译。编译器给了我一个错误消息,但我无法理解为什么它不起作用。有谁知道它为什么不起作用?非常感谢你。

简化代码如下,

#include <memory>

class MemberFunctionPointerInConstructor {
public:
    MemberFunctionPointerInConstructor(void) {
        std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter);  // this line makes a compiler error message
    }

    void deleter(int* value) {
        delete value;
    }
};

编译器的错误消息如下:

error: invalid use of non-static member function
std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter);
                                                                 ^

非常感谢。

4 个答案:

答案 0 :(得分:8)

要使用未绑定到类实例的成员函数,您必须声明方法static

static void deleter(int* value) {
    delete value;
}

答案 1 :(得分:3)

如果要将非静态成员函数用作删除器,则必须将其绑定到实例 - 但请注意,在调用删除器时,实例仍需要处于活动状态。例如,

class ShorterName {
public:
    ShorterName(void) {
        using namespace std::placeholders;
        auto a = std::shared_ptr<int>(new int(1),
                   std::bind(&A::deleter, this, _1));
    }

    void deleter(int* value) {
        delete value;
    }
};

如果您不需要特定实例,可以将该功能设置为静态,因此它不需要实例。

class ShorterName {
public:
    ShorterName(void) {
        auto a = std::shared_ptr<int>(new int(1), deleter);
    }

    static void deleter(int* value) {
        delete value;
    }
};

答案 2 :(得分:3)

有几种方法可以解决这个问题。如果您实际上是指非静态成员函数,那么这样做的一种方式(不是唯一的方法)将通过lambda function

class MemberFunctionPointerInConstructor {
public:
    MemberFunctionPointerInConstructor() {
        std::shared_ptr<int> a = std::shared_ptr<int>(
            new int(1), 
            [this](int *p){this->deleter(p);});  
    }   

    void deleter(int* value) {
        delete value;
    }   
};  

答案 3 :(得分:1)

答案很简单。

static void deleter(int* value) {
    delete value;
}

你必须使函数变为静态,否则它可能会使用该类的成员变量,只有在有一个实例可以完成时才会这样做,而且情况并非如此。