对象 ** 到对象 * 之间的融合

Converation between object ** to object*

本文关键字:对象 融合 之间      更新时间:2023-10-16

>我想知道为什么我的变量是指针到指针的类型(**) 而不仅仅是 1 分。

错误是:

无法将"单项式**"转换为"单项式* const"作为回报

为什么会这样?

我的头文件:

class Polynomial
{
private:
Monomial * poly_array [];
int poly_counter;
public:
Polynomial();
~Polynomial();
Monomial * const getPoly_array();
}

我的多项式文件的 cpp 看起来像这样:

Monomial * const Polynomial::getPoly_array()  {
return poly_array;
}

我有另一个单一对象的头文件和 cpp 文件。

class Monomial
{
private:
int coeff;
int exp;
public:
Monomial(int coeff, int exp = 0);
Monomial();
int GetCoeff();
int GetExp();
//Operator Overloading
void operator += (const Monomial& monomial);
Monomial operator *(const Monomial& monomial1);
void operator *=(const Monomial& monomial);
bool operator ==(const Monomial& monomial);
//Neagative the monomial
void negate();
friend std::ostream& operator << (std::ostream& out, const Monomial& m);
char* stringRepresentation() const;

};
std::ostream& operator << (std::ostream& out, const Monomial& m);

除了错误显示的问题之外,还有另一个问题:

Monomial * poly_array [];

这个声明在C++中格式不正确。方括号表示您声明了一个数组。但是,您没有指定数组的大小。不能声明大小不确定的成员数组。

在C中(自C99以来),它将是"灵活数组成员"的有效声明(编辑:尽管如前所述,它必须是最后一个成员)。虽然这种声明在标准C++中格式不正确,但一些C++编译器允许将其作为语言扩展。

我将假设您已经设法克服了这些问题,并且poly_array是一个格式良好的Monomial*数组,因为这就是您的错误消息所暗示的。


我想知道为什么我的变量是指针到指针 (**) 的类型,而不仅仅是 1 个指针。

在 C++(以及 C)中,您不能按值返回数组(也不能将它们作为参数传递给函数)。在此类上下文中使用时,标识符将隐式转换为指向数组第一个元素的指针。这种转换称为数组"衰减"。

数组中每个对象的类型Monomial*因此Monomial**指向此类对象的指针。这就是为什么返回表达式的类型为Monomial**,它与您声明的类型Monomial* const冲突,因为一个不能隐式转换为另一个。类型系统使你免于做一件愚蠢的事情。


我怀疑你打算poly_array是一个Monomial对象的数组。你可以像这样声明这样的数组:

Monomial  poly_array[number_of_elements];
//      ^ Note the lack of *

number_of_elements必须在编译时知道。如果这不适合您的情况,您应该改用std::vector<Monomial>


声明Monomial * const getPoly_array()等同于Monomial * getPoly_array()const不起作用。