C ++构造函数不会看到成员对象的成员

时间:2014-04-15 11:41:08

标签: c++

我遇到了一个奇怪的情况:我有一个对象有一些字符串成员,我用来初始化其他一些成员,如:

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并不重要,问题是相同的

你怎么建议我这样做?

2 个答案:

答案 0 :(得分:4)

您正在foo1foo2s1s2分别返回对本地变量的引用)这是不允许的,并且使用该引用将调用未定义的行为。

答案 1 :(得分:2)

您将在foo1和foo2中返回对局部变量的引用。这些变量的范围仅限于定义它们的函数体。它们会在函数返回后立即消失,因此在此之后尝试引用它们会导致程序崩溃。