(主要是从accessing variable from another class template粘贴以分隔两个问题)
我正在尝试创建一个容器类系统,可以与数据加载器类一起使用,以从文本文件加载数据
这是两类数据:
class Customer
{
//...
};
class Tour
{
std::vector<Customer*> custPtrs;
//...
};
这是我的两个容器类:
template <class T>
class P_VContainer
{
boost::ptr_vector<T> data;
//...
};
template <class T>
class ListContainer
{
std::list<T> data;
//...
};
最后是我的数据加载器模板:
template<template<class> class T>
class DataLoader
{
T<Customer> custList;
T<Tour> tourList;
//...
};
我重载了&gt;&gt;在Customer和Tour中的运算符,以便可以将ifstream传递给它们,从流中获取一行,进行标记并将其放入对象实例变量中。
容器类按顺序处理插入,数据加载器管理列表并创建ifstream,以便将其传递给对象。
这是我的问题:
我首先加载我的客户文件,然后填充该列表。
之后我必须加载游览,其中包含预订它们的客户的customerID,并且我希望将这些客户存储在每个游览对象的指针向量中,以便可以轻松访问客户信息。
目前我将customerID存储为字符串列表,然后当游览全部加载时,将custList传递给搜索custList的函数,将其与字符串列表匹配
这意味着我必须维护两个列表,一个字符串和其他指针,基本上双处理所有数据..考虑到数据集非常大,这意味着加载时间要长很多..
所以我想知道是否有一种方法可以从重载的&gt;&gt;内部访问custList实例变量运行Tour并在创建Tour对象时生成指针列表?
从技术上讲,一切都发生在DataLoader类的范围内,所以我认为它应该是可能的,但我只是不太确定如何去实现它...也许让它成为朋友类?我试过这样做但到目前为止没有运气..
任何帮助将不胜感激,并为长篇大论的解释感到抱歉,希望它有意义..
答案 0 :(得分:1)
最终的流使用情况如下:
custStream >> customers >> toursStream >> tours;
要实现这一点,您必须将ifstream与两个流包装在一起 - 对于客户和游览,并将客户列表保留在流中,这里是代码,您可以将容器替换为您喜欢的容器:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
class CustomersInFileStream {
public:
std::vector<Customer> customers;
std::ifstream &input;
CustomersInFileStream(std::ifstream &fileIn)
:input(fileIn){
}
};
class ToursInFileStream {
public:
std::vector<Customer> customers;
std::ifstream &input;
ToursInFileStream(std::ifstream &fileIn)
:input(fileIn){
}
};
CustomersInFileStream &operator>>(CustomersInFileStream &input, std::vector<Customer> customers) {
// perform file parsing here using ifstream member
input.customers = customers;
return input;
}
ToursInFileStream &operator>>(CustomersInFileStream &customersStream,
ToursInFileStream &toursStream) {
toursStream.customers = customersStream.customers;
return toursStream;
}
ToursInFileStream &operator>>(ToursInFileStream &input, std::vector<Tour> tours) {
// perform file parsing here using ifstream member
// you also do have customers list here
return input;
}
int main()
{
std::ifstream customersFile("~/customers.txt");
std::ifstream toursFile("~/tours.txt");
CustomersInFileStream custStream(customersFile);
ToursInFileStream toursStream(toursFile);
std::vector<Customer> customers;
std::vector<Tour> tours;
custStream >> customers >> toursStream >> tours;
return 0;
}