想象一下,我有一个带有成员的类,它在实例化时对某个向量做了一些工作,并且该类没有默认的构造函数:
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))
{}
};
但这看起来非常糟糕。有干净的方法吗?
答案 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
而添加的两个实际临时临时成员。