首页 > 解决方案 > 通过类中的方法通过指针访问main中的数组

问题描述

我的代码需要一些帮助,我为即将到来的考试做准备。

我有 3 个类的代码:Package、Person 和 Courier(从 Person 继承)。然后我在主包中有数组。现在我被困在某个点上,我有'Courier k1(p, p+3);' 这意味着我需要通过指针将这个 Courier 包从 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)并且只有括号内的值应该改变?

标签: c++arrayspointersvector

解决方案


首先,该行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>已经有一个构造函数,它接受一对表示范围的指针。它是cppreference 上的#5 ,看起来像

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

因为原始指针是一种输入迭代器。

所以构造函数定义(如果写在类定义之外就会出现):

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 */

推荐阅读