【问题标题】:Converation between object ** to object*对象**到对象*之间的对话
【发布时间】:2017-10-14 09:15:52
【问题描述】:

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

错误是:

无法将“Monomial**”转换为“Monomial* 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;
}

我还有一个 Monomial Object 的头文件和 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);

【问题讨论】:

  • 您根本不应该在这里使用指针。只需将单项式存储在 std::vector&lt;Monomial&gt;
  • 你认为Monomial * poly_array []; 是做什么的?如果 sizeof(Polynomial) 只包含这个,你觉得会是什么?

标签: c++ arrays c++11 pointers type-conversion


【解决方案1】:

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

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&lt;Monomial&gt;


PS。声明Monomial * const getPoly_array() 等价于Monomial * getPoly_array()const 无效。

【讨论】:

  • 灵活数组成员不需要是最后一个数据成员吗?
  • @aschepler 好点。似乎还有其他语法错误;我想 OP 并没有完全设法创建一个 mcve。
猜你喜欢
  • 2022-01-10
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
相关资源
最近更新 更多