将值分配给类的构造函数中的常量动态大小的数组

时间:2012-10-01 07:29:04

标签: c++ class constructor const

  • 我有两个班,A和B
  • B类有一个私有成员变量,它是一个动态的常量 对象A的大小数组
  • B类的构造函数之一将持续引用 一个A类对象,用于在B类中设置数组

B级:

class B
{
  private:
    const A** theArray;
  public:
    B(const A&);
};

B::B(const A& newA)
  : theArray(newA) //<-- ??
{
}

当我尝试编译程序时,我收到错误消息“无法将'const A'转换为'const A **'”

如何将对象传递到成员初始化列表中,以便我可以从中创建一个数组?

编辑1: 这是一个comsci类赋值。我们现在正在学习类,并且赋值让我们为这个特定类创建三个独立的构造函数(一个复制构造函数;一个用于在B类中将'A对'添加到'theArray'中;以及一个添加第一个A对象的构造函数进入'theArray'(这是有问题的构造函数)。)

这个想法是你调用列表中的第三个构造函数来创建一个对象。然后,如果要将另一个A对象添加到数组,则可以调用第二个构造函数。然后,如果你想要一个对象的副本,你将使用复制构造函数。

4 个答案:

答案 0 :(得分:1)

这是在C ++中指定动态大小的数组的方式。 你的B班应该是:

class B
{
    std::vector<A> const theArray;
public:
    B( A const& initialA )
        : theArray( n, initialA )
    {
    }
};

这留下了n(元素数量)的位置问题 在数组中)来自,为什么你想要创建一个 所有元素都相同的不可变数组。

事实上,我更怀疑你是否准确地描述了你正在尝试的内容 去做。你实际上想要一个指向A的指针数组(实际的 A个对象位于其他位置,而不属于B 宾语)?使用A个对象const(但不是数组 - “a 常量动态大小的数组“是矛盾的”。在这种情况下:

class B
{
    std::vector<A const*> theArray;
public:
    B( A const& initialEntry )
        : theArray( 1, &initialEntry )
    {
    }
};

然后您可以稍后添加其他条目(始终为A const*类型)。

答案 1 :(得分:1)

  

当我尝试编译程序时,我收到一条错误,说“无法从'const A'转换为'const A **'”

然后,您必须做的第一件事是理解编译器错误。什么是试图说编译器?

B构造函数中,您正在使用类型const A **的给定参数初始化类型const A &的成员;它们的类型不同,这就是编译器抱怨的原因。

那么,该怎么做才能解决它?

您必须使B构造函数采用与参数相同类型的成员变量。

class B
{
private:
    const A** theArray;
public:
    B(const A**);
};

B::B(const A** newA)
    : theArray(newA) //<-- They're of the same type: no problem.
{
}

但是你必须确保类外的调用与构造函数定义匹配。

但不是这样,我建议修改设计,你确定裸指针是解决问题的唯一方法吗?您必须回答此问题才能改进class B

  • 在哪里创建动态内存,哪里被销毁?
  • class B取得给定A**的所有权?

如果class B是动态内存的所有者,您必须考虑创建并销毁theArray内部的class B而不是外部。

如果class B不是动态内存的所有者,则必须非常小心内存:theArray指向的内存将在class B之前销毁。 ?换句话说,可能是class B实例,theArray指向的内存已被删除?在这种情况下,智能指针可能是一个很好的帮助。

答案 2 :(得分:0)

您没有为指针数组分配任何内存。

对于构造函数,您应该传递A的指针而不是引用。

答案 3 :(得分:0)

当然std::vector<int>更可取 - 请参阅其他答案以了解如何使用它。 如果你真的想使用动态数组 - 请记得添加析构函数和复制/移动内容。

请记住,您需要知道传递给B(const A&)的A对象是什么。这不可能是暂时的。这个newA必须和B对象一样长。如果它是动态的(由new创建) - 您必须知道哪个对象将负责删除它。这是B级还是什么?

无论如何,只是出于直接回答的目的:

在C ++ 11中,使用新的{}初始值设定语法非常简单,与std::vector

相同
class B
{
  private:
    const A** theArray;
  public:
    B(const A&);
};

B::B(const A& newA)
  : theArray(new const A*[some_size] { &newA } ) //<-- ??
{}

在C ++ 03中,需要一个额外的静态方法来创建/初始化动态数组:

class B
{
  private:
    const A** theArray;
    static const A** makeArray(const A& a)
    {
       const A** rv = new const A*[some_size]();
       rv[0] = a;
       return rv;
    }
  public:
    B(const A&);
};

B::B(const A& newA)
  : theArray(makeArray(newA))  //<-- ??
{}