gpt4 book ai didi

C++ 初始化列表——参数来自构造函数体本身?

转载 作者:行者123 更新时间:2023-11-30 00:53:10 25 4
gpt4 key购买 nike

我有一些这样的代码:

#include <string>

class another_foo
{
public:
another_foo(std::string str)
{
// something
}

private:
// something
};

class foo
{
public:
foo();

private:
another_foo obj;
};

foo::foo() : obj(str) // no `: obj("abcde")`, because it is not that simple in real situation.
{
std::string str = "abcde"; // generate a string using some method. Not that simple in real situation.
// do something
}

我将初始化 obj,它是 foo 的私有(private)成员。 但这段代码无法编译。我如何在初始化列表中使用构造函数主体中的变量?

AFAIK,唯一的方法是将生成 str 的代码作为另一个函数从构造函数中分离出来,然后直接在初始化列表中调用该函数。那就是……

#include <string>

class another_foo
{
public:
another_foo(std::string str)
{
// something
}

private:
// something
};

class foo
{
public:
foo();

private:
another_foo obj;

// std::string generate_str() // add this
static std::string generate_str() // EDIT: add `static` to avoid using an invalid member
{
return "abcde"; // generate a string using some method. Not that simple in real situation.
}
};

foo::foo() : obj(generate_str()) // Change here
{
// do something
}

但是有没有更好的方法呢?

最佳答案

是的,你必须把它移到一个函数中。如果它是单一用途的东西(仅用于此初始化)并且您可以访问 C++11 lambda,则可以使用单一用途的 lambda。否则,只需像您一样使用成员函数。只是要小心在那里调用虚函数,因为该对象仍在构造中。如果可能,最好将其设为 static

Lambda 示例:

class foo
{
public:
foo();

private:
another_foo obj;
};

foo::foo() : obj([] { return "abcde"; } ())
{
// do something
}

关于C++ 初始化列表——参数来自构造函数体本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17213010/

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