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对象添加到数组,则可以调用第二个构造函数。然后,如果你想要一个对象的副本,你将使用复制构造函数。
答案 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)) //<-- ??
{}