我遇到了一个奇怪的情况:我有一个对象有一些字符串成员,我用来初始化其他一些成员,如:
class A
{
private:
B b;
C c1;
C c2;
public:
A(const string& str) : b(str), c1(b.foo1()), c2(b.foo2()) {}
// ...
};
class B
{
public:
B(const string& str)
{
// ...
}
string& foo1()
{
string s1;
// initialization
return s1;
}
string& foo2()
{
string s2;
// initialization
return s2;
}
};
class C
{
private:
string s;
public:
C(const string& str) : s(str) {}
};
当我调用A:
的构造函数时string str = "some string here";
A(str);
我收到以下错误:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::replace
问题在于:
A(const string& str) // str == "some string here"
: b(str), // enters the B(str), str == "some string here"
c1(b.foo1()), // enters the C(str), str the string that I want
c2(b.foo2()) // enters the C(str), but str is not visible
A::b
是否超出范围?foo1()
或foo2()
来初始化c2并不重要,问题是相同的你怎么建议我这样做?
答案 0 :(得分:4)
您正在foo1
和foo2
(s1
和s2
分别返回对本地变量的引用)这是不允许的,并且使用该引用将调用未定义的行为。
答案 1 :(得分:2)
您将在foo1和foo2中返回对局部变量的引用。这些变量的范围仅限于定义它们的函数体。它们会在函数返回后立即消失,因此在此之后尝试引用它们会导致程序崩溃。