如何在另一个类中调用类类型的向量?
Posted
技术标签:
【中文标题】如何在另一个类中调用类类型的向量?【英文标题】:How do I call a vector of type class inside another class? 【发布时间】:2019-09-25 16:34:01 【问题描述】:我得到了 main 并被告知创建一个程序来响应 main 使用 3 个类。游乐园班、骑手班和骑行班。 我想将骑手添加到游乐设施向量中,并将该向量存储在游乐园向量中。我究竟做错了什么?我该如何解决这个问题?
#include <iostream>
#include <string>
using namespace std;
class Rider
string name;
int height;
public:
Rider(string name, int height)
this->name=name;
this->height=height;
Rider(int height)
this->height=height;
;
class Ride
public:
vector <Rider> all_riders;
;
class Amusement_park
vector <Ride> all_rides;
public:
Amusement_park(int numRides)
all_rides[numRides];
vector <Rider> get_ride(int whichRide)
vector <Ride> the_ride= all_rides[whichRide];
return the_ride;
void add_line(class Rider)
the_ride.pushback(Rider);
;
int main()
Rider r1("Yaris",45); //name, height in inches
Rider r2(49); //height in inches
Amusement_park a1(3); //3 is the number of rides in the park
a1.get_ride(1).add_line(r1); //add a rider to the line of a ride
Amusement_park a2(2); //2 is the number of rides in the park
a2.get_ride(1).add_line(r2); //add a rider to the line of a ride
return 0;
【问题讨论】:
您可能想要为Ride
类添加一个名称。游乐园里的大多数游乐设施都有名字。
【参考方案1】:
我将为您的代码提供一些建议,其中一个(或多个)可能会解决您可能遇到的问题。
首先,尽可能尝试使用构造函数初始化列表。通常,当构造函数很明显时,使用这样的列表是微不足道的。在这种情况下,您可以这样做:
class Rider
string name;
int height;
public:
Rider(string name, int height) : name(name), height(height)
Rider(int height) : height(height)
;
其余的微不足道的构造函数也是如此。
现在,如果您仔细查看 Amusement_park
类的 c'tor,您会发现您尝试访问 vector
中尚未定义的索引。也就是说,您有一个 empty 向量,它应该包含 Ride
类型的对象,但由于它是空的,因此尝试访问它的内容(无论您尝试访问什么索引)就是我们调用未定义的行为。那是一块你不知道它持有什么的内存,那是因为你从来没有告诉你的编译器有多少 Ride
对象将在那里,以便你的程序可以正确地分配内存并在那里为你初始化对象。为了让您实际创建适当大小的向量,或者更准确地说,正确调整向量的大小,您的 Amusement_park
c'tor 应该类似于
Amusement_park(int numRides)
all_rides.resize(numRides);
您在 Amusement_park 中的get_ride
功能也不是很好。
实际上,您的整个声明 a1.get_ride(1).add_line(r1)
并没有按照您的意图进行。
首先,get_ride()
函数返回 vector
的 Rider
,它没有 add_line()
成员函数。您实际上希望它返回一个Amusement_park
对象,这是您的代码中唯一具有这样一个成员函数的对象。但是,如您所见,返回它是不合逻辑的。
简而言之,您的代码包含许多缺陷,从逻辑上讲,这两种语言都是如此。 因此,我建议您: 1)仔细检查代码的逻辑; 2) 从一本不错的 C++ 教程开始。
祝你好运!
【讨论】:
我已经按照你说的修复了一些问题,现在我只有一个错误信息。我将 add_line 函数移到了我的 Ride 类中。我现在收到一条错误消息,上面写着 [错误:'Rider' 没有引用值 all_riders.push_back(Rider); ] 您是否修改了get_ride()
内部的Amusement_park
函数?它应该返回一个Ride
对象,而不是你的代码中的vector<Rider>
。为此,您需要做的就是修改返回类型,然后返回值all_rides[whichRide]
。然后您可以通过您的get_ride()
函数返回的对象在Ride
类中调用函数add_line()
。另外,您的编译器在引发该错误消息时指向哪一行?
另外,您的add_line()
函数的参数不正确。 Rider
本身就是一个类型,实际上是由你定义的。所以,从逻辑上讲,你的函数应该期望一个类型为Rider
的变量,因此它的声明应该是void add_line(Rider riderId)
,其中riderId 是变量名,Rider 是它的类型。然后,您像往常一样将 RiderId 推送到您的向量。
我按照你说的做了,错误指向我的 Ride 类中的 add_line 函数。第二条评论刚刚解决了它。我使用 (class Rider) 作为我的参数,而不是 (Rider (variable name))。谢谢!
我认为这将解决您手头的问题。但是,请尝试遵循我的第二个建议/建议。这里有很多不错的选择 [***.com/questions/388242/…【参考方案2】:
在您的函数add_line(class Rider)
中,没有引用the_ride
来推动骑手。您可以将您从get_ride(int whichRide)
获得的vector<Rider>
传递给函数,或者您可以像这样将get_ride 和add_line 组合到一个函数中:
void add_rider_to_line(int whichRide, class Rider)
all_rides[whichRide].push_back(Rider);
【讨论】:
以上是关于如何在另一个类中调用类类型的向量?的主要内容,如果未能解决你的问题,请参考以下文章