【问题标题】:Calling constructor of another class through Initialization list. Having problems通过初始化列表调用另一个类的构造函数。有问题
【发布时间】:2012-07-20 00:28:08
【问题描述】:

这是我的示例代码:

#include <iostream>
using namespace std;

class Base
{
public:
    Base (int v, char z) {x=v;y=z;};
    int x;
    char y;
};

class Bar
{
public:
    Bar(int m, char n):q(m),s(n),base(q,s){};
    Base base;
    int q;
    char s;    
};

int main()
{
    Bar barObj(5,'h');    
    cout << barObj.base.x << barObj.base.y << endl;       
    return 0;
}

为什么我得到0 的输出? http://ideone.com/pf47j

另外,一般来说,在另一个类中创建成员对象并调用该对象的构造函数的正确方法是什么,就像上面在 class Bar 内部使用 class Base 的对象基础所做的那样?

【问题讨论】:

  • Base base; 不是Base base (int v, char z);。读一本合适的书。
  • 您链接中的代码与您上面的代码不同
  • 除了Cat Plus Plus所说的,还需要使用mnqs 在构造 base 之前还没有被初始化。
  • 如果你使用gcc,那么尝试用-Werror -Wall -Wextra -pedantic-errors编译
  • 你真的应该发布给出问题的代码,而不是你所拥有的旧版本

标签: c++ class object constructor initializer-list


【解决方案1】:

数据成员的初始化顺序遵循其声明顺序,而不是您列出其初始化程序的顺序。因此,Bar::base 总是在 Bar::qBar::s 之前初始化。
http://ideone.com/M6iKR 所示,对于Bar::Bar(int m, char n),使用mn 初始化base 可以正常工作。

【讨论】:

  • 当您使用m,n 而不是q,s 时,顺序无关紧要。
  • 谢谢,我刚刚将 Bar::base 的声明移到 q 和 s 下面。
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2021-01-05
  • 1970-01-01
相关资源
最近更新 更多