c++ - 通过类中的方法通过指针访问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;
现在我很担心。现在值看起来像这样:
- 8 - 返回 0(如果没有值,我的默认构造函数将值设置为 0)
- 9 - 返回 193,因为它对所有值求和
- 10 - 返回与上面相同,因为它是从 k3 分配的
- 11 - 返回 245,因为它添加了 2 个值
- 12 - 返回 193。
现在,它应该像这样工作还是值 8 和 12 应该相同(等于 0)并且只有括号内的值应该改变?
解决方案
首先,该行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 */
推荐阅读
- vue.js - 将 var 传递给 meta 中的 vue 路由器
- django - django celery AsyncResult AttributeError: 'DisabledBackend' 对象没有属性 '_get_task_meta_for'
- java - 无法在 Eclipse 中导出到存档文件“访问被拒绝”
- ansible - 稳定 | 错误!任务中未检测到任何操作。这通常表示模块名称拼写错误或模块路径不正确
- cytoscape.js - 方向感知邻里
- java - 如何在 Java 中处理一维数组的跳过输入
- arrays - For 循环中的 If 语句
- c# - 在 C# 中动态更改配置设置 kafka
- powerbi - 如何创建一个执行条件的度量,以及 groupby 和按结果计算该组的计数(DAX/PowerBI)
- python - 如何使用另一种方法(例如 for 循环)缩短一长串 if 语句