gpt4 book ai didi

c++ - 在构造函数初始值设定项中使用函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:58 24 4
gpt4 key购买 nike

想象一下,我有一个类,它的成员在实例化时对 vector 执行某些操作,并且该类没有默认构造函数:

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() 不是左值。

我可以添加额外的成员变量来表示 vector 的第一个元素和长度,并将它们传递给 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))
{}
};

但这似乎非常虚伪。有没有一种干净的方法可以做到这一点?

最佳答案

这看起来像是一个简单的问题,header(...) 的签名需要其参数的左值。这可以通过添加一个调用原始 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 而添加的实际上是临时临时成员的两个成员。

关于c++ - 在构造函数初始值设定项中使用函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22209340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com