• 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;

    }

  • 相关阅读:
    Oracle基础知识整理
    linux下yum安装redis以及使用
    mybatis 学习四 源码分析 mybatis如何执行的一条sql
    mybatis 学习三 mapper xml 配置信息
    mybatis 学习二 conf xml 配置信息
    mybatis 学习一 总体概述
    oracle sql 语句 示例
    jdbc 新认识
    eclipse tomcat 无法加载导入的web项目,There are no resources that can be added or removed from the server. .
    一些常用算法(持续更新)
  • 原文地址:https://www.cnblogs.com/rednodel/p/5148156.html
Copyright © 2020-2023  润新知