具有成员变量向量的 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
的向量?
嗯,这就是分配的方式(我猜是更难完成:)),但无论如何我还没有到那一点,所以我认为它是矢量 CResort
和CHotel
应该做什么。您应该从它们的公共接口开始,并且只将向量视为实现细节。
【参考方案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& CHotel::GetTouristList()
和 const CTouristList& CHotel::GetTouristList() const
)并实现CTouristList::Add
、CTouristList::Remove
、CTouristList::Get
等方法
或者您可以直接在CHotel
类上添加CHotel::AddTourist()
之类的方法。
2) 构造函数。构造函数中不需要任何东西。但是对于vector<CHotel*>
,您可能需要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++ 类 <另一个类>的主要内容,如果未能解决你的问题,请参考以下文章