【问题标题】:Implementation of array attribute with C++ class用 C++ 类实现数组属性
【发布时间】:2019-07-11 12:30:51
【问题描述】:

编辑

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

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


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

背景

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

代码

为了清楚起见,这里是一个简化版的界面,只显示了构造函数:

销售.h

class Sale {
    int* products_id[];

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

现在,需要实现接口:

销售.cpp

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

问题

  1. 由于某些原因,我的 IDE(VS Code)报错了

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

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

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

【问题讨论】:

  • 你是如何学习 C++ 的? int* products_id[] 成员和 int& products_id[] 让我觉得你的学习资源对你不利。你看过我们的curated book list了吗?
  • 这里有好几层问题。最外层(如果我们忽略 IDE 与编译器的区别)是您试图将“整数”分配给“整数指针”。下一个是您正在接受一组引用。接下来是您分配数组的语法不是 C++。接下来是在 C/C++ 中没有分配原始 C 数组这样的事情。下一个是您可能不希望将指针数组作为类“属性”。下一个是您没有为阵列分配内存。下一个是数组衰减到指针(大小!)等等。
  • 我的建议是你要么去学习数组和指针,不要用这些不必要的 OOP 东西弄乱你的程序(和你的学习经验),或者去学习/使用std::vectorstd::array 并忘记所有关于C 数组的事情。虽然,您将永远能够在不了解内存和对象布局/生命周期的情况下推进编程。
  • @yzt 我已经编辑了这个问题。请检查一下。

标签: c++ arrays oop object interface


【解决方案1】:

第一部分:指针和C-Array

我猜你在写这样的代码 sn-p 之前学过 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 &amp;b = a; 这样的代码时,您打算将b 设为a 的别名,这意味着“现在ab 相同”。因此int&amp; products_id[] 表示指向int 引用的指针。而且我认为这不是你想要的。

【讨论】:

    【解决方案2】:

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

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

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

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

    用容器解决的数组问题:

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

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

    【讨论】:

    • 我是用这个例子来学习的。你知道如何让上面的代码工作吗?
    • @Isfaaq:另一个答案和 yzt 的 cmets 解释说你在这里有很多问题。并且没有办法在对象中拥有一个大小未知的 array。语言不允许。所以肯定有办法满足真正的底层需求,但我不能只让上面的代码工作
    • 谢谢。我已经编辑了这个问题。也许您可以提供替代解决方案。
    • @Isfaaq:不要使用数组。只需让销售类包含项目向量。我说的是项目向量,而不是指向项目的指针向量。你甚至可以在向量中放置项目。
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多