具有成员变量向量的 C++ 类 <另一个类>

Posted

技术标签:

【中文标题】具有成员变量向量的 C++ 类 <另一个类>【英文标题】:C++ Class with member varialble vector <another class> 【发布时间】:2013-04-13 09:53:23 【问题描述】:

我的任务是制作有关某个国家/地区的度假村的信息系统,能够从/到文件中读取/写入度假村的数据并对其进行修改。

class CTоurist
    string m_StrName;
    string m_StrCountry;
    int m_iAge;
public:
    //constructors, mutators, accessors overloading operator <<,>>

;

我写这门课没有问题。在这里我有一个类,它包含作为第一类对象的成员变量向量

class CHotel

    string m_strHotelName;
    int m_iNumberOfBets;
    double m_dAveragePrice; //average price per bet in the hotel
    vector <CTourist> m_vecTourists; //vector of tourists rested in the hotel
public:
.....
;

还有一个类Resort,包含第二类对象的成员变量向量

class CResort

    string m_ResortName;
    unsigned m_Height;
    vector<CHotel*> m_Hotels;
public:
.....
;

所以这就是问题所在。我不确定如何为该向量变量编写访问器、修改器和构造器,以便我可以使用它们的属性。感谢您的检查,如果有人能帮我弄清楚这些功能,我将不胜感激!

【问题讨论】:

为什么是CHotel*而不是CHotel的向量? 嗯,这就是分配的方式(我猜是更难完成:)),但无论如何我还没有到那一点,所以我认为它是矢量 目前跨度> 这真的取决于CResortCHotel 应该做什么。您应该从它们的公共接口开始,并且只将向量视为实现细节。 【参考方案1】:

如果我理解正确,您想知道从 cResort 获得酒店的最佳方式。

我会推荐

cHotel* GetHotelByName(std::string& a_sName)

    for(int i = 0; i < m_Hotels.size(); ++i)
    
        if(m_Hotel[i].GetName() == a_sName)
            return m_Hotel[i]
    
return nullptr; // if non found return return null

并向您的酒店类添加一个 GetName 函数,该函数返回其名称的字符串。 这也允许您设置名称等。

【讨论】:

【参考方案2】:

1) Accessor, mutator:有很多选择。

您可以创建另一个类,如 CTouristList(和 CHotelList),包装 vector,从 CHotel 类引用它(访问器方法如 CTouristList&amp; CHotel::GetTouristList()const CTouristList&amp; CHotel::GetTouristList() const)并实现CTouristList::AddCTouristList::RemoveCTouristList::Get等方法

或者您可以直接在CHotel 类上添加CHotel::AddTourist() 之类的方法。

2) 构造函数。构造函数中不需要任何东西。但是对于vector&lt;CHotel*&gt;,您可能需要CResort 中的析构函数来显式释放CHotel 实例。虽然不确定为什么要使用指向 CHotel 的指针。

【讨论】:

【参考方案3】:

您可以将访问器和修改器函数放在 CTourist 中,就像它们没有存储在 Vector 中一样。

要在 CHotel 中使用它们,您可以在 CHotel 中添加一个函数,该函数返回指向 CTourist 的指针。

// Access a CTourist
Hotel.getTourist(1)->setName("Tourist name");

添加一个返回访问过酒店的游客数量的方法将更容易循环访问它们。

for(int i = o; i < Hotel.touristCount(); ++i)

  // Do something useful
  std:: cout << "Hello " << Hotel.getTourist(i)->getName();

在这种情况下,您的 CHotel::touristCount() 将是向量的包装.size();

如果您不希望 CHotel 外部的代码直接访问 CTourist 对象,那么请在 CHotel 中创建包装函数来执行您希望在外部执行的操作。

即 std::cout

而不是

std::cout getName();

【讨论】:

请使用迭代器;它更惯用且更易读。 我同意。但是,我认为这会增加此示例所需的复杂性,因为它需要 CHotel 中的另一个包装器方法,该方法返回当前使用的存储类型和 auto 关键字的迭代器,以便他以后可以更改存储机制。关于使用迭代器,我再次同意你的看法,但没有它们,这个例子似乎更清楚。

以上是关于具有成员变量向量的 C++ 类 <另一个类>的主要内容,如果未能解决你的问题,请参考以下文章

传递给另一个成员变量的 C++ 类接口

向量中不存在 C++ 字符串成员变量

c ++在析构函数中删除向量类成员内存

C++ 固定数量的向量大小作为类成员

C++类和对象下

将类成员向量的内容复制到另一个向量中,然后将它们交换回来