【问题标题】:C++ private variable with no default ctor - not compiling?没有默认 ctor 的 C++ 私有变量 - 不编译?
【发布时间】:2011-11-20 12:15:10
【问题描述】:

我有一个没有默认构造函数的类 obj1,也没有默认构造函数的类 obj2,并且有一个 obj1 的元素作为私有变量:

我想要类似下面的代码 - 但实际上这不会编译,告诉我 obj1 没有默认构造函数。

class obj1{
    obj1(some parameters){};
}

class obj2{
    obj1 _myObj1;
    obj2(some parameters){
        _myObj1 = obj1(some parameters)
    }
} 

有什么想法吗?

【问题讨论】:

    标签: c++ compilation


    【解决方案1】:

    你需要公开你的构造函数,你需要调用obj2构造函数初始化列表中的obj1。

    class obj1{
    public:
        obj1(some parameters){};
    }
    
    class obj2{
        obj1 _myObj1;
    public:
        obj2(some parameters) : _myObj1(some parameters)
        {
        }
    } 
    

    【讨论】:

      【解决方案2】:

      obj1的构造函数设为public,并使用obj2中的初始化列表。

      class obj1{
      public:
          obj1(some parameters){};
      };
      
      class obj2{
          obj1 _myObj1;
          obj2(some parameters) : _myObj1(some parameters) {
          }
      };
      

      【讨论】:

      • ...或者让 obj2 成为 obj1 的朋友,这样你就可以调用私有构造函数了。
      【解决方案3】:

      你必须把你的构造函数放在public区:

      class obj1{
          public:
          obj1(some parameters){};
      }
      

      甚至你二等:

          class obj2{
              obj1 _myObj1;
              public:
              obj2(some parameters) : _myObj1(some parameters){
              }
          } 
      

      更多:

      事实上,当你想禁止你的代码直接实例化一个对象时,私有构造函数很有用。私有构造函数最流行的用法是单例类。

      【讨论】:

        【解决方案4】:

        您需要使构造函数可访问类 obj2。这可以通过将其公开来实现,以便所有其他类都可以使用它,或者您可以将 obj2 标记为 obj1 的朋友。

        class obj2;
        
        class obj1{
            obj1(some parameters){};
            friend class obj2;
        }
        
        class obj2{
            obj1 _myObj1;
            obj2(some parameters){
                _myObj1 = obj1(some parameters)
        }
        

        或将构造函数标记为公共

        obj1 {
        public:
            obj1(some parameters){};
        }
        

        【讨论】:

          猜你喜欢
          • 2014-12-07
          • 1970-01-01
          • 2020-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多