Реализация атрибута массива с классом C ++ - PullRequest
0 голосов
/ 18 февраля 2019

РЕДАКТИРОВАТЬ

Я изучаю 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 Code)жалуется на ошибку

    нет подходящей функции преобразования из "product_id" в "product_id *"

  2. Я не могу найти какую-либо соответствующуюресурсы онлайн.

Буду признателен, если сомОн может помочь мне или, по крайней мере, указать мне правильное направление.С уважением.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я начну здесь с вашего первого предложения:

Я пытаюсь написать конструктор для класса, который содержит массив в качестве одного из его атрибутов.

Это смело ... Массивы не являются первоклассными элементами языка и часто остаются скрытыми в стандартных контейнерах.Общее правило в C ++: если у вас нет веских причин использовать необработанный массив в C ++, просто придерживайтесь контейнеров.Исключения составляют:

  • взаимодействие с устаревшим кодом или кодом C
  • реализация пользовательских контейнеров
  • оптимизация низкого уровня
  • и, конечно, обучение ...

Проблемы с массивами, которые решаются с контейнерами:

  • размер массива определяется во время компиляции => используйте std::vector здесь
  • вы не можете напрямую назначать массивы, а только обрабатывать их поэлементно => * здесь достаточно 1025 *
  • они молча затухают указателям при использовании в выражениях, поэтому при передаче массива вФункция, вызываемый только получает указатель на первый элемент и не может угадать размер
  • динамические необработанные массивы трудно управлять, потому что класс будет содержать только необработанный указатель, и у вас будет проблема владения: один и только один свободный для malloc

Так что класс, который содержит массив в качестве одного из своих атрибутов , не должен быть обычным общим классом.Это должен быть либо контейнер с проблемой копирования / перемещения / деструктора (найдите правило 3, правило или 5).Или размер должен быть постоянным для координат, например.

0 голосов
/ 18 февраля 2019

Первая часть: Pointer и C-Array

Я думаю, вы изучили Java до написания такого фрагмента кода.

В Java у нас есть обработчики (или указатели)в некоторой степени) каждому объекту, но в C ++ мы передаем объекты напрямую путем копирования (без ссылочной нотации или переопределения operator=).Следовательно, стиль Java Type arr[] неправильно используется в вашем коде, и он имеет совершенно разные значения в соответствии с контекстами C / C ++:

  1. Гибкий член массива , который доступен только в 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, что означает "теперь a и b одинаковы".Поэтому int& products_id[] означает указатель на ссылку int.И я думаю, что это не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...