如何在另一个类中调用类类型的向量?

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() 函数返回 vectorRider,它没有 add_line() 成员函数。您实际上希望它返回一个Amusement_park 对象,这是您的代码中唯一具有这样一个成员函数的对象。但是,如您所见,返回它是不合逻辑的。

简而言之,您的代码包含许多缺陷,从逻辑上讲,这两种语言都是如此。 因此,我建议您: 1)仔细检查代码的逻辑; 2) 从一本不错的 C++ 教程开始。

祝你好运!

【讨论】:

我已经按照你说的修复了一些问题,现在我只有一个错误信息。我将 add_line 函数移到了我的 Ride 类中。我现在收到一条错误消息,上面写着 [错误:'Rider' 没有引用值 all_riders.push_back(Rider); ] 您是否修改了get_ride() 内部的Amusement_park 函数?它应该返回一个Ride 对象,而不是你的代码中的vector&lt;Rider&gt;。为此,您需要做的就是修改返回类型,然后返回值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&lt;Rider&gt; 传递给函数,或者您可以像这样将get_ride 和add_line 组合到一个函数中:

void add_rider_to_line(int whichRide, class Rider)

    all_rides[whichRide].push_back(Rider);

【讨论】:

以上是关于如何在另一个类中调用类类型的向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个类中调用一个类的 main() 方法?

如何在另一个类中调用一个类中的函数对象?

C#中如何在另一个类中调用Form1窗体控件的方法呢?

如何在另一个类中调用列表对象

在 React JavaScript 中,如何在另一个类中调用一个类?

C ++:如何访问另一个类中的类函数?