【问题标题】:Passing parameters to the constructor of a class which is a member of another class将参数传递给作为另一个类成员的类的构造函数
【发布时间】:2013-03-22 13:18:55
【问题描述】:

我有一个名为 Bar 的课程, 在这个类 Bar 中有一个 Foo 类型的对象(一个类)。 类 Bar 有 3 个参数,x、y 和 z。 Foo 有 2 个参数,y 和 z。

目前我正在这样做:

class Bar {
 public:
  Bar(int x, int y, int z) { 
      foo = new Foo(y, z);
      do something with x;
  }

 private:
  Foo * foo;
};

我记得在一本书中看到使用冒号的另一种方法,但我不记得具体是怎么做的。

做这种事情的标准或通常的方法是什么?

【问题讨论】:

  • Foo 是一个容器类,包含一个 myClass 类型的向量。当我这样做时,我现在收到错误: 1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\vector(1541): error C2036: 'myClass *' : unknown size 它编译并运行良好当我使用动态分配完成时。
  • 你能发布你的实际代码吗?
  • 你在前向声明类吗?您可以对指针和引用执行此操作,但编译器需要普通成员的完整定义(读取:标头)。

标签: c++ class parameters constructor


【解决方案1】:

使用initializer list 并避免动态分配:

class Bar {
public:
    Bar(int x, int y, int z) : foo(y, z) {}
private:
    Foo foo;
};

【讨论】:

    【解决方案2】:
    class Bar {
     public:
      Bar(int x, int y, int z) : foo(y, z) { 
          do something with x;
      }
    
     private:
      Foo foo;
    };
    

    【讨论】:

      【解决方案3】:

      你的困惑应该是

      ... 
      Bar(int x, int y, int z) : foo(new Foo(y,z)) { 
      ... 
      private: 
      Foo* foo; 
      ...
      

      我看到其他答案不使用指针。但正确的应该是这个。

      【讨论】:

      • 如果“正确”是指“保留不必要的动态分配和内存泄漏”,那么您是对的。就个人而言,我更喜欢建议避免动态分配的答案。
      • 我试图坚持原来的问题。我看到了一个指针类型Foo 然后使用了指针初始化,因为我们不知道Foo 的内部结构。也许有链接列表,用户想在某处做foo = foo->next;。此外,最好学习首选非指针对象是一种常见的做法。
      • @FredrickGauss 是的,它们真的很危险。如果您想了解一些有用的信息,请查找“RAII”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      相关资源
      最近更新 更多