gpt4 book ai didi

c++ - 字符串和函数对象

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:16 25 4
gpt4 key购买 nike

我遇到了这个问题,但我不知道该怎么办...

class Goo
{
char _ch;
string _str;
public:
function<void(void)> dobedo;

// Constructor 1
Goo(string s) : _str(s)
{
cout << "Constructed: [" << &_str << "]: " << _str << endl;
dobedo = [&]()
{
cout << "Dobedo: [" << &_str << "]: "<< _str << endl;
};
}
// Constructor 2
Goo(char ch) : _ch(ch)
{
dobedo = [&]() {
cout << "Dobedo: " << _ch << endl;
};
}
void show() { cout << "Show: [" << &_str << "]: " << _str << endl; }
};


int main()
{
string myStr1("ABCD");
string myStr2("EFGH");
vector<Goo> goos;

goos.push_back(Goo(myStr1));
goos.push_back(Goo(myStr2));

goos[0].dobedo();
goos[1].dobedo();

goos[0].show();
goos[1].show();

return 0;
}

由于某种原因,函数对象无法打印 _str,尽管能够找到内存地址:

Constructed: [00EFF80C]: ABCD
Constructed: [00EFF7B0]: EFGH
Dobedo: [00EFF80C]:
Dobedo: [00EFF7B0]:
Show: [032F2924]: ABCD
Show: [032F296C]: EFGH

不过我对 char 变量没有任何问题。

int main()
{
vector<Goo> goos;

goos.push_back(Goo('#'));
goos.push_back(Goo('%'));

goos[0].dobedo();
goos[1].dobedo();

return 0;
}

输出给出:

Dobedo: #
Dobedo: %

有什么想法吗?

最佳答案

您的代码中有未定义的行为,但没有定义复制构造函数。默认复制构造函数按值复制所有成员。因此,您的 lambda 对象已被复制,并且它包含对已销毁对象的引用 - _str(当调用 push_back 方法时必须重新分配 vector)。

Goo 类定义复制构造函数和移动构造函数:

Goo(const Goo& g)
{
_str = g._str;
dobedo = [&]()
{
cout << "Dobedo: [" << &_str << "]: "<< _str << endl;
};
}

Goo(Goo&& g)
{
_str = move(g._str);
dobedo = [&]()
{
cout << "Dobedo: [" << &_str << "]: "<< _str << endl;
};
}

关于c++ - 字符串和函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49299634/

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