2013-10-19 51 views
0

(主要来自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; 

    //... 
}; 

我已经超载>>在客户和旅游经营者,这样的ifstream的可以传递给他们,一条线是从物流中取出,标记化和把它放到对象实例变量中。

容器类按顺序处理插入操作,数据加载器管理列表并创建ifstream,以便将其传递给对象。

这是我的问题:

我加载我的客户在第一个文件,并填充该列表。

之后,我不得不加载旅游,其中有顾客的客户ID预订他们,我想存储这些客户在每个旅游对象的指针向量,以便客户信息很容易访问。

在此刻我存储customerIDs作为一个字符串列表,那么当旅行团都装,传递CUSTLIST成通过CUSTLIST搜索功能,用字符串列表匹配它

这意味着我我不得不维护两个列表,一个字符串和其他指针,基本上双处理所有的数据..考虑到数据集是相当大的,这意味着更长的加载时间..

所以我想知道如果有一种方法可以从Tour的overloaded >>运算符中访问custList实例变量,并在创建Tour对象时生成指针列表?

从技术上讲,所有事情都发生在DataLoader类的范围内,所以我认为它应该是可能的,但我只是不太确定如何去做..也许使它成为一个朋友类?我曾尝试这样做,但还没有过迄今为止任何运气..

任何帮助,将不胜感激,并遗憾的长篇大论的解释,希望这是有道理的..

+0

顾客如何与旅游相关?了解这两种数据类型之间的关系很重要。从逻辑上讲,我假设客户类型拥有旅游列表。 –

+0

既没有从彼此继承,反而是另一种方式,Tour拥有一个客户列表,这就是为什么我需要在创建Tour对象时访问已经加载的客户列表。我将更新代码以反映关系。 – guskenny83

+0

“此刻我将customerIDs存储为一个字符串列表,然后当浏览器全部加载时,将custList传递到一个通过custList进行搜索的函数,并将其与字符串列表进行匹配”我认为'boost :: serialize '可以在内部处理这种情况。无论如何,当客户ID列表也应该工作时,为什么还需要'Tour'中的指针列表?如果你真的需要指针,你可以通过'>>'的左侧提供客户列表,即'mysource >> someTour',并使用'mysource'的自定义类型。 – dyp

回答

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; 
} 
+0

我宁愿建议使用客户列表创建自定义流作为参数给ctor,而不是使用'operator >>',因为它不是流提取;但除此之外,+1,我也想在我对OP的评论中提出这种形式。 – dyp

+0

@DyP custStream >>客户返回>> tours的输入参数CustomersInFileStream。测试也顺利进行,你认为它会失败吗? –

+0

所有运营商都在那里,但使用错过的游览流,现在修复。 –