Доступ к массиву в main по указателям на метод в классе - PullRequest
0 голосов
/ 06 января 2020

Мне нужна помощь с моим кодом, я готовлюсь к предстоящему экзамену.

У меня есть код с 3 классами: Package, Person и Courier (наследуется от Person). Тогда у меня есть массив в основном с пакетами. И теперь я застрял в некоторой точке, где у меня есть «Курьер k1 (p, p + 3);» это означает, что мне нужно назначить этому курьеру пакеты от p до p + 3 по указателям. И моя проблема в том, что я не знаю, как получить доступ ко всем нужным мне пакетам из любого класса. Простой пример кода:

class Package
{
 string _address;
 float _value;
};

class Person
{
 string _name, _lastname;
};

class Courier:public Person
{
vector < Package > tab;
}

int main()
{
  Package p[] = {
    Package("Dabrowskiego 33", 123.00),
    Package("NMP 12", 40.00),
    Package("Armii Krakowej 4", 30.00),
    Package("Andersa 6", 51.00),
    Package("Kukuczki 13", 12.00),
    Package("Skrzyneckiego 5", 40.00),
  };
   Courier k1(p, p+3);
   cout << k1.value() << endl;

return 0;
};

Код, приведенный выше, является только примером, код в main неизменяем, потому что он является базой от учителя. Я пытался создать метод в Courier с подсчетом количества пакетов, а затем добавить значения к вектору, как это

for(int i=0;i<amount;i++)
            {
                tab.push_back(Package(*(p+i)));
            }

Я не знаю, хороший ли это способ, даже возможно ли это сделать, но тогда я не знать, как отображать значения с помощью функции value ().

С уважением

Редактировать: //

Спасибо всем за помощь, мне удалось завершить программу, и все, кажется, работает , Но у меня есть одно сомнение.

Courier k2;
  cout << "---- 8 ----" << endl;
  cout << k2.value() << endl;

  {
    Courier k3(k1);
    cout << "---- 9 ----" << endl;
    cout << k3.value() << endl;

    k2 = k3;
    cout << "---- 10 ----" << endl;
    cout << k2.value() << endl;

    k1 = k1 + p[4];
    k1 = k1 + p[5];

    cout << "---- 11 ----" << endl;
    cout << k1.value() << endl;

  }

  cout << "---- 12 ----" << endl;
  cout << k2.value() << endl;

Теперь я обеспокоен. Прямо сейчас значения выглядят так:

  1. 8 - возвращает 0 (в качестве моего конструктора по умолчанию установите значение 0, если значения нет)
  2. 9 - возвращает 193, поскольку оно суммирует все значения
  3. 10 - возвращает то же, что и выше, потому что он присваивает его из k3
  4. 11 - возвращает 245, потому что добавляет 2 значения
  5. 12 - возвращает 193.

А теперь, должно ли это работать так, или значения 8 и 12 должны быть одинаковыми (равными 0), и должны изменяться только значения в скобках?

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Во-первых, строка Courier k1(p, p+3); подразумевает, что класс Courier имеет конструктор, который принимает два аргумента-указателя. Это выглядело бы следующим образом:

class Courier : public Person
{
public:
    Courier(const Package* first, const Package* last);
private:
    std::vector<Package> tab;
};

(Если ваш класс еще не обсуждал const, вы, вероятно, можете смело пропустить это упражнение, поскольку main его не использует.)

Определение конструктора включает инициализацию всех базовых классов и членов. В этом случае базовый класс Person и член tab.

Код ничего не говорит о имени или фамилии, поэтому создание по умолчанию базового подобъекта Person имеет смысл .

К счастью, std::vector<T> уже имеет конструктор, который принимает пару указателей, представляющих диапазон. Это # 5 для cppreference , который выглядит как

template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );

, поскольку необработанный указатель является типом Input Iterator.

Итак, определение конструктора (как оно появляется, если написано вне определения класса):

Courier::Courier(const Package* begin, const Package* end)
    : Person(),        /* or just omit the Person() */
      tab(first, last) /* copies all the Packages into the vector */
{}                     /* nothing else to do after tab is initialized */
1 голос
/ 06 января 2020

Если у вас есть указатель на объект, вы можете делать с ним все, что позволит объект. Что я думаю, что вы хотите что-то вроде

Courier (Package * current, Package * end)
{
    while (current != end) // loop until the end. Note this could be off by one.
                           // I don't know id the last Package is supposed to be added
    {
        tab.push_back(*current); // copy current Package into vector
        current++; //advance to next Package
    }
}

Почему

У вас нет amount, только начало и конец, поэтому вы начинаете с начала и смотрите на все Package до конца (возможно, включая конечный пакет, но это было бы необычно). Похоже, ваш инструктор может пытаться обучать итераторов.

Примечание:

Ниже Конрад указывает, что это может быть уменьшено до более разумного построения vector:

Courier (Package * start, Package * end):tab(start, end)
{
}

Это более умный способ заполнения vector, но он не демонстрирует, как перебирать указатели, поэтому он "менее образовательный".

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