2

在 C++ 中,我有一个对象A,它有一个构造函数,该构造函数接受一个istream(从文件中加载自身)。我有另一个A作为成员的班级。我无法A从初始化列表中调用 's 构造函数,因为我还没有打开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");
  }
}
4

5 回答 5

2

改为使用指向对象的指针:

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

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

于 2012-07-05T12:02:59.650 回答
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) {
  }
}
于 2012-07-05T12:29:56.937 回答
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);
  }
}

顺便说一句,这需要AB从某个共享父级继承负载能力,但这显然超出了这个问题的范围。

于 2012-07-05T12:30:56.163 回答
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;
    }
}
于 2012-07-05T12:03:12.593 回答
1

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

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

A类{
上市:
    A(std::istream const&);
}

B类{
上市:
  B(std::istream const&);
}

我的班级{
  std::istream 是;
  一个;
  乙乙;
上市:
  MyClass() : is("路径"), a(is), b(is) {
  }
}
于 2012-07-05T12:21:39.760 回答