依赖于尚未构造的对象的构造函数

时间:2012-07-05 11:48:19

标签: c++ oop constructor

在C ++中,我有一个对象A,它有一个接受istream的构造函数(从文件加载自身)。我有另一个有A成员的班级。我无法从初始化列表中调用A的构造函数,因为我还没有打开istream。一旦我在我的类的构造函数中打开它,就调用A的构造函数为时已晚。有没有办法在初始化列表中打开istream到一些临时对象,以便我可以将它发送到A的构造函数? 如果有,是否有任何类型的保证在订单上调用初始化列表,以便istreamA之前初始化?

一个例子可能会有所帮助:

class A {
public:
  A(std::istream const&);
}

class B {
public:
  B(std::istream const&);
}

class MyClass {
  A a;
  B b;
public:
  MyClass() : a(is), b(is) {  // <-- How to do this?
    std::istream is("path");
  }
}

5 个答案:

答案 0 :(得分:2)

使用指向对象的指针:

class MyClass {
   A *a;
   B *b;
public:
   MyClass()
   {
       std::istream is("path");
       a = new A(is);
       b = new B(is);
   }
}

不要忘记在析构函数中释放内存。

答案 1 :(得分:2)

由于两个成员都应该依赖于同一个istream,为什么不呢:

class A {
public:
  A(std::istream const&);
}

class B {
public:
  B(std::istream const&);
}

class MyClass {
  A a;
  B b;
public:
  MyClass(std::istream const& is) : a(is), b(is) {
  }
}

答案 2 :(得分:2)

这是另一个想法...如果您想避免动态分配并使用单个临时istream,您可以将AB的加载阶段从他们移开构造:

class A {
public:
  Load(std::istream const&);
}

class B {
public:
  Load(std::istream const&);
}

class MyClass {
  A a;
  B b;
public:
  MyClass() {
    std::istream is("path");
    a.Load(is);
    b.Load(is);
  }
}

BTW要求AB继承某个共享父级的加载能力,但这显然超出了这个问题的范围。

答案 3 :(得分:1)

也许我错过了什么,但问题是:

class MyClass {
    A* a;
    B* b;
public:
    MyClass() {
      std::istream is("path");
      a = new A(is);
      b = new B(is);
    }

    ~MyClass() {
        delete a;
        delete b;
    }
}

答案 4 :(得分:1)

类的成员变量的初始化将按照您在类声明中指定的顺序进行。

请注意,当初始化列表中的顺序与成员变量的声明顺序不对应时,gcc将发出警告(给定-Wall)。该类中的声明顺序具有权威性。

class A {
public:
    A(std::istream const&);
}

class B {
public:
  B(std::istream const&);
}

class MyClass {
  std::istream is;
  A a;
  B b;
public:
  MyClass() : is("path"), a(is), b(is) {
  }
}