zoukankan      html  css  js  c++  java
  • c++中在一个类中定义另一个只有带参数构造函数的类的对象

    c++中在一个类中定义另一个只有带参数构造函数的类的对象,编译通不过

    #include<iostream> using namespace std;

    class A {

        public:  A(int i){}

        };

    class B {

        public:  B(){}

        private: 

          //A a; //这里当然通不过,没有可用的构造函数 

          A a(5); //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了,郁闷!

    };

    void main() {  B b; }

    我现在想在B类的数据成员中定义A类的对象,但是A类中只有带参数的构造函数,请问如何解决?

    改成: #include<iostream>

    using namespace std;

    class A { public:  A(int i){} };

    class B {

      public:  B():a(5)//构造函数初始化子对象  {  }

      private:  //A a; //这里当然通不过,没有可用的构造函数 

      A a; //但是这里也编译通不过,编译器居然把此语句当成一个定义一个函数A a()了,郁闷!

      };

    void main()

    {  B b; }  

    注意: 在B中定义 A a; 是可以通过的,但在其他地方(比如函数中)这样是不对的。 在B中定义 A a; 只是告诉编译器:“B有一个A类的对象”,并不在定义的时候创建a这个对象成员,也就不考虑它的构造函数。a这个对象成员的创建是在执行B的构造函数时进行的,B的构造函数后面必须以初始化表的形式为a对象成员提供参数,比如 B( ) : a( 1 ) { } 如果在构造函数中不为a提供参数,会发生错误。 在其他地方(比如函数中)定义A的对象时,必须定义成 A a(参数);的形式。因为定义时就要创建A的对象,所以要考虑它的构造函数

    你的程序出现错误不是因为在B中定义 A a;引起的。

    是因为:

    1、你定义了A a(5)。 这是不行的,因为此时并不创建A对象,不能为其提供参数。你说“编译器把此语句当成一个定义一个函数A a()”也是不对的。就是因为这时不能为a提供参数,一定要在B的构造函数中提供!

    2、你的程序没有为B提供一个“可以为a提供参数”的构造函数。 这样你在主函数中定义B b的时候,就不能初始化它里面的a。

    所以,你的代码应将这两个错误改过来,即写成如下:

    class A

    {

    public:    

      A( int i ){}

    };

    class B {

    public:    

      B():a(1){}   

    //或:B( int i ):a( i ){ }。对a提供参数一定要按                  

    //这种形式,在冒号后,不能在花括号里面!

    private:    

      A a;

    };

    void main()

    {    

      B b;

    }

  • 相关阅读:
    Codeforces Round #299 (Div. 2) B. Tavas and SaDDas 水题
    Codeforces Round #299 (Div. 2) A. Tavas and Nafas 水题
    Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力
    2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
    hdu 3340 Rain in ACStar 线段树区间等差数列更新
    hust 1385 islands 并查集+搜索
    2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集
    2015 UESTC 数据结构专题G题 秋实大哥去打工 单调栈
    2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
    2015 UESTC 数据结构专题D题 秋实大哥与战争 SET的妙用
  • 原文地址:https://www.cnblogs.com/rednodel/p/5148156.html
Copyright © 2011-2022 走看看