【问题标题】:How do I instantiate an object inside of a C++ class?如何在 C++ 类中实例化对象?
【发布时间】:2012-11-06 10:26:14
【问题描述】:

出于 C++ 学习的目的,我有文件 class1.hclass1.cppclass2.hclass2.cpp。我想在class2 中实例化一个名为class1Obj 的对象。我在哪里以及如何实例化这个对象?我是否在class2 构造函数中实例化classObj

过去我创建了一个指向类的指针,当时效果很好,但我认为指针不是我这次应该采取的路线,因为classObj 只会在class2 内部使用。

【问题讨论】:

  • 只需将class1类型的成员变量添加到class2即可。它将在 class2 对象的构造时实例化。
  • 你可以在任何你想要的地方实例化它,你只需要编写相应的正确代码。如果你在构造函数中这样做,那就更好了。如何实例化:Class1 Instance;
  • 您不需要显式的“新”运算符来实例化。所以一个变量就足够了

标签: c++ instantiation


【解决方案1】:
class class1
{
   //...
};

class class2
{
   class1 member; 
   //...
};

在class2 ctor中,可以在构造函数初始化列表中初始化member

class2::class2(...)
: member(...)
{
   //...
}

【讨论】:

    【解决方案2】:

    那么您过去是如何创建指针的?大概,你做了这样的事情:

    class class2
    {
      public:
        class2()
        {
          class1Pointer = new class1();
        }
        // Destructor, copy constructor/assignment, etc...
      private:
        class1* class1Pointer;
    };
    

    现在你想做同样的事情,但这次你不想要一个指向class1的指针,你想要一个class1本身:

    class class2
    {
      public:
        class2() {}
        // Destructor, copy constructor/assignment, etc...
      private:
        class1 class1Obj;
    };
    

    当您的class2 对象被创建时,该对象将被默认初始化。如果您的 class1 构造函数需要一些参数,请使用初始化列表:

    class class2
    {
      public:
        class2() : class1Obj(1, 2, 3) {}
        // Destructor, copy constructor/assignment, etc...
      private:
        class1 class1Obj;
    };
    

    【讨论】:

      【解决方案3】:

      在一个类中实例化一个类:

      #include <iostream>
      using namespace std;
      
      
      
      class Foo 
      {
       public:
           Foo(int i) 
           {
      
           }  
      };
      
      class Bar  
      {     
        Foo i;  //<--- instantiate a class inside a class ----
        public:
      
        Bar() : i(1)  //<--- instantiate a class inside a class ----
        {
      
        }  
      };
      
      
      
      
      
      int main(void)
      {
      
      
        Bar b;
      
      
      
      
        cout<<" \nPress any key to continue\n";
        cin.ignore();
        cin.get();
      
         return 0;
      }
      

      【讨论】:

        【解决方案4】:

        这取决于您的 Class1。如果它的构造函数接受一些参数,那么您必须在 Class2 构造函数或初始化列表中显式初始化它。

        Class2 {
        public:
        
            class2() {
                //Here m_class1Obj will be instantiated
                m_class1Obj = Class1(/*some params*/);
            }
        
        private:
            Class1 m_class1Obj;
        };
        

        或者

        Class2 {
        public:
        
            class2() : m_class1Obj() {}
        
        private:
            Class1 m_class1Obj;
        };
        

        【讨论】:

        • 除了你没有显示初始化,你正在显示赋值。
        • -1 表示不使用构造函数初始化列表。如果 M_class1Obj 是 const 怎么办?那你会怎么做呢?
        • 建设性的批评者。已更新。
        猜你喜欢
        • 2013-11-10
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多