【问题标题】:c++ class in a class default constructorc++ 类中的类默认构造函数
【发布时间】:2012-12-07 12:01:59
【问题描述】:

我关心的是默认构造函数及其初始化列表。在一个简单的情况下很清楚,例如:

class A
{
  protected:
       double d1;
       //classB obj1; //how to initialize this one in a default constructor?
  public:
       A (double x = 0.0): d1(x){} //constructor
       virtual ~A(void) {};
  //something
}

但是如何初始化classB的对象,它有大量的成员呢?或者一般如何在默认构造函数中初始化一些具有大量或未知数量要初始化的参数的类型?

【问题讨论】:

  • classB 的构造函数会处理这个问题,而不是 classA

标签: c++ class initialization default-constructor


【解决方案1】:

您可以在member initializer list 中通过调用默认构造函数或其他构造函数来初始化obj1

class A
{
  protected:
       double d1;
       classB obj1; 
       pthread_mutex_t m_mutex;
  public:
       A (double x = 0.0): d1(x), obj1(), m_mutex(PTHREAD_MUTEX_INITIALIZER) {} 
       virtual ~A(void) {}
       //something
}

如果 classB 有很多像你描述的那样的成员,你可能会打破类设计规则 - one class does one thing。您可能希望将 classB 分解为小的独立类。

【讨论】:

  • 如果我的 A 类成员之一是类型结构 pthread_mutex_t 怎么办?
  • @eco_student A(...) : d1(x), mutex(PTHREAD_MUTEX_INITIALIZER) { ... }
  • @JoachimPileborg 让我问你,{...} 在你的回答中是什么意思?我不想错过你的一些线索 :) 我的意思是在 billz 的帖子中早先的两个问题。不在您的帖子中
  • 哦,很抱歉,我没明白,我仍然可以在那里添加一些东西,我还没有 C++ 语法的经验。
  • @billz 我猜你在构造函数中输入 obj() 而不是 classB() 时出错(构造函数的名称与类的名称匹配,而不是对象)
【解决方案2】:

如果你想显式初始化一个对象,只需将它添加到构造函数初始化列表中:

struct Foo
{
    Foo(int arg) { ... }
};

struct Bar
{
    Foo foo;

    Bar()
        : foo(123)  // Initialize `foo` with an argument
    { ... }
};

【讨论】:

    【解决方案3】:

    如果成员可以由其默认构造函数初始化,那么它甚至不必在初始化列表中,因为默认构造函数没有参数。将调用默认构造函数。基元没有默认构造函数,所以如果你想让它们初始化,它们必须在初始化列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多