【问题标题】:OOP Constructor question C++OOP 构造函数问题 C++
【发布时间】:2010-09-21 10:04:10
【问题描述】:

假设我有两个班级 A 和 B。

class A
{
    private:
        int value;
    public:
        A(int v)
        {
            value = v;
        }
};

class B
{
    private:
        A value;
    public:
        B()
        {
            // Here's my problem
        }

}

我想这是一些基本的东西,但我不知道如何调用 A 的构造函数。

编译器还需要类 A 的默认构造函数。但是如果 A 有默认构造函数,那么每当我声明 A 类型的变量时,就不会调用默认构造函数。在默认构造函数有之后,我仍然可以调用构造函数吗?被叫了?或者我可以先声明一个类的实例,然后再调用构造函数?

我认为这可以使用指针来解决,但可以避免吗?

我知道你可以在 C# 中做这样的事情。

编辑:我想在构造函数中进行一些计算,而不是初始化类。我事先不知道这些值。

假设我正在从文件中读取值,然后相应地初始化 A。

【问题讨论】:

    标签: c++ oop constructor


    【解决方案1】:

    您要查找的术语是初始化列表。它用冒号与构造函数主体分开,并确定成员的初始化方式。尽可能选择初始化而不是赋值。

    class A
    {
        int value;
    
    public:
    
        A(int value) : value(value) {}
    };
    
    class B
    {
        A a;
    
    public:
    
        B(int value) : a(value) {}
    }
    

    我想在构造函数中进行一些计算,而不是初始化类。我事先不知道这些值。

    只需在一个单独的函数中执行计算,然后在初始化列表中调用该函数。

    class B
    {
        A a;
    
        static int some_computation()
        {
            return 42;
        }
    
    public:
    
        B() : a(some_computation()) {}
    }
    

    【讨论】:

    • 你不需要 A 中的复制构造函数吗?
    • @Manoj:是什么让你这么认为?我在我的代码中没有看到复制 A 对象的任何地方。
    • 哦,是的。事实上,你不复制构造函数。我对 (some_computation()) 有点困惑。
    【解决方案2】:

    您使用初始化列表来初始化成员变量。

    public:
        B() : value(4) {   // calls A::A(4) for value.
        }
    

    【讨论】:

      【解决方案3】:

      Or can I declare an instance of a class and then call a constructor later?

      是的,你可以这样做。而不是 (A value;) 声明 (A* value;),然后 B 的构造函数将是B():value(new A(5)){}

      在 B 的析构函数中,你必须这样做 delete value;

      我认为这可以使用指针来解决,但可以避免吗?

      是的。使用 shared_ptr。

      【讨论】:

      • 谢谢,这正是我要找的。​​span>
      • 天哪,这是 SO 而不是 C++!在罗马做到入乡随俗。除非万不得已,否则不要使用指针。
      • 嗯,你可以这样做,但我不明白你为什么会这样做。如果您总是需要存储A,请使用变量A a,而不是A* a。这样你就避免了在堆上分配一个A,如果你忘记在析构函数中删除它也可能导致内存泄漏。就像 FredOverflow 的回答一样。它更快,更不容易出错。
      【解决方案4】:

      试试:

          B() :
            value(0)
          { 
              // Here's my problem 
          } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        相关资源
        最近更新 更多