0
  • 我有两个班,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 课程作业。我们现在正在学习类,分配让我们为这个特定的类创建三个单独的构造函数(一个复制构造函数;一个用于将新的 A 对象添加到 B 类的“theArray”中;以及一个添加第一个 A 对象的构造函数进入'theArray'(这是有问题的构造函数)。)

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

4

4 回答 4

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已被删除的实例?在这种情况下,智能指针可能是一个很好的帮助。

于 2012-10-01T08:13:11.713 回答
1

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

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

这就留下了一个问题,即n(数组中元素的数量)来自哪里,以及为什么你要创建一个所有元素都相同的不可变数组。

事实上,我相当怀疑你是否准确地描述了你正在尝试做的事情。您实际上是否想要一个指针数组A(实际 A对象位于其他位置,而不是B 对象的一部分)?对于A对象const(但不是数组——“一个恒定的动态大小的数组”是矛盾的)。在这种情况下:

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

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

于 2012-10-01T07:55:35.917 回答
0

当然std::vector<int>更可取 - 有关如何使用它,请参阅其他答案。 如果您真的想使用动态数组 - 请记住添加析构函数并复制/移动内容。

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

无论如何,只是为了显示直接答案:

{}在 C++11 中,使用新的初始化语法非常简单,与 forstd::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))  //<-- ??
{}
于 2012-10-01T10:34:24.313 回答
0

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

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

于 2012-10-01T08:01:23.007 回答