在构造函数初始化器中使用函数调用

时间:2014-03-05 21:10:02

标签: c++ c++11 constructor

想象一下,我有一个带有成员的类,它在实例化时对某个向量做了一些工作,并且该类没有默认的构造函数:

struct Header
{
    static const Header & Read(uint8_t * & buffer, size_t & length);
    Header( some params );
}

class C
{
private:
    std::shared_ptr<std::vector<uint8_t>> mBuffer;

public:
    Header header;

    C(std::shared_ptr<std::vector<uint8_t>> p_buffer) :
        mBuffer(p_buffer),
        header(Header::Read(p_buffer->data(), p_buffer->size()))
    {}
};

这非常合理地无法编译,因为data()和size()不是lvalues。

我可以添加其他成员变量来表示向量的第一个元素和长度,并将它们传递给Read():

class C
{
private:
    std::shared_ptr<std::vector<uint8_t>> mBuffer;
    uint8_t * head;
    size_t length;

public:
    Header header;

    C(std::shared_ptr<std::vector<uint8_t>> p_buffer) :
        mBuffer(p_buffer),
        head(p_buffer->data()),
        length(p_buffer->size()),
        header(Header::Read(head, length))
    {}
};

但这看起来非常糟糕。有干净的方法吗?

1 个答案:

答案 0 :(得分:1)

这似乎是一个简单的问题,header(...)的签名要求其参数的左值。这可以通过添加static函数来修复,该函数调用原始标题而不需要左值,如下所示:

class C
{
private:
    std::shared_ptr<std::vector<uint8_t>> mBuffer;
    static const Header& ReadStatic(uint8_t *buffer, size_t length) {
        // You can call Header::Read now, because when it comes to passing lvalues,
        // function parameters are fair game:
        return Header::Read(buffer, length);
    }
public:
    Header header;

    C(std::shared_ptr<std::vector<uint8_t>> p_buffer) :
        mBuffer(p_buffer),
        header(ReadStatic(p_buffer->data(), p_buffer->size()))
    {}
};

这可以让你摆脱为调用Header::Read而添加的两个实际临时临时成员。

相关问题