【问题标题】:Access array in main by pointers by method in class通过类中的方法通过指针访问main中的数组
【发布时间】:2020-04-24 04:34:21
【问题描述】:

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

我有 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)并且只有括号内的值应该改变?

【问题讨论】:

  • 您需要向Courier 添加一个构造函数,它接受一对指向Package 的指针,并使用它们来初始化tab 成员变量。您还需要添加一个value 函数,并执行value 函数应该做的任何事情。 (打印出所有包裹的总价值?)
  • 请提供minimal reproducible example,其中包括您的尝试。目前还不清楚底部代码 sn-p 相对于所有其他代码的放置位置。
  • @MartinBonnersupportsMonica 您的意思是“返回所有包裹的总值”。 (我认为“return”和“print”之间的区别有时会让初学者感到困惑。)
  • @aschepler Arwk!是的,我的意思是返回。我已经不是初学者了,真的不应该犯那样的错误!
  • @MartinBonnersupportsMonica 是的,我认为这只是一个失误。我只是在说明为什么我认为它值得评论,而不是仅仅为了它自己而吹毛求疵。

标签: c++ arrays pointers vector


【解决方案1】:

首先,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&lt;T&gt; 已经有一个构造函数,它接受一对表示范围的指针。是#5 on cppreference,那个样子

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

【讨论】:

    【解决方案2】:

    如果你有一个指向对象的指针,你可以用它做任何对象允许的事情。我认为你想要的东西像

    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,只有一个开始和结束,所以你从开始看所有Packages直到结束(可能包括结束包,但这将是异常)。看起来您的讲师可能正在尝试教授迭代器。

    注意:

    Konrad 在下面指出,这可以简化为更智能地构造vector

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

    这是填充vector 的更聪明的方法,但它没有演示如何遍历指针,因此它“缺乏教育意义”。

    【讨论】:

    • 这行得通,但为什么不直接调用适当的vector 构造函数呢?
    • @KonradRudolph 因为我很傻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多