用C ++类实现数组属性

时间:2019-02-18 06:59:39

标签: c++ arrays oop object interface

编辑

我正在通过我就读的大学提出的一系列问题来学习C ++。这是该问题的摘录:

  

一家零售店希望存储有关其销售的信息。典型信息   希望存储有关销售的信息:销售标识号(唯一   每个销售的编号),客户的姓氏和其他名称,以及   客户的地址。一次销售最多可以包含10个不同的项目,   每个项目的数量不同。对于每个商品,销售类别应存储   物料编号,物料描述,单位成本和物料的单位数量   购买以及该项目的总费用。


TLDR:我正在尝试为包含数组作为其属性之一的类编写构造函数。

背景

我正在学习C ++中的类,目前正在尝试使用接口。

代码

为清楚起见,这是接口的简化版本,仅显示构造函数:

Sale.h

class Sale {
    int* products_id[];

    public:
    Sale(int& products_id[]);
};

现在,该接口需要实现:

Sale.cpp

#include "Sale.h"
Sale::Sale(int& product_id[]) {
    this->product_id[] = product_id[];
};

问题

  1. 由于某些原因,我的IDE(VS代码)抱怨错误

      

    不存在从“ product_id”到“ product_id *”的适当转换函数

  2. 我无法在线找到任何相关资源。

如果有人可以帮助我或至少将我指出正确的方向,我将不胜感激。 问候。

2 个答案:

答案 0 :(得分:1)

第一部分:指针和C数组

我想您是在编写此类代码段之前学习过Java的。

在Java中,每个对象都有处理程序(或某种程度上的指针),但在C ++中,我们通过复制直接传输对象(没有引用符号或重新定义operator=)。因此,Java风格的Type arr[]在您的代码中被滥用,根据C / C ++上下文,它具有完全不同的含义:

  1. Flexible array member,仅在C99中可用
  2. 只是函数参数中的一个指针(不是数组)
  3. 在不直接指定长度的情况下初始化数组
  4. 也许更多...

例如:

#include <iostream>
using std::cout, std::endl;
int calc_sum(int arr[], int len) { // pointer
    int ans = 0;
    for (int i = 0; i < len; i++) {
        ans += arr[i];
    }
    return ans;
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(int);
    cout << n << endl;
    cout << calc_sum(arr, n) << endl;
    return 0;
}

第二部分:参考

在编写类似int a = 3; int &b = a;的代码时,您打算将b用作a的别名,这意味着“现在ab相同”。因此,int& products_id[]是指向int引用的指针。我认为那不是您想要的。

答案 1 :(得分:1)

我将从你的第一句话开始:

  

我正在尝试为包含数组作为其属性之一的类编写构造函数。

这很勇敢...数组不是语言的头等元素,通常隐藏在标准容器中。 C ++中的一般规则是:如果没有充分的理由在C ++中使用原始数组,则只需坚持使用容器即可。例外是:

  • 与旧代码或C代码接口
  • 实现自定义容器
  • 低级优化
  • 当然还有学习...

使用容器解决的数组问题:

  • 在编译时确定数组的大小=>在此处使用std::vector
  • 您不能直接分配数组,而只能按元素进行处理=> std::array就足够了
  • 当在表达式中使用它们时,它们会默默地衰减指针,因此,当您将数组传递给函数时,被调用方仅会收到指向第一个元素的指针,而无法猜测其大小
  • 动态原始数组很难管理,因为该类仅包含一个原始指针,并且您将遇到所有权问题:每个malloc只能释放一个

因此,包含数组作为其属性之一的类不应是普通的普通类。它应该是一个包含复制/移动/析构函数问题的容器(搜索规则3,规则或5)。或者,例如对于坐标,大小必须恒定。