Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正是时候。这是我想避免的事情。PS:目前,outputInterface和dataClassBase之间没有关系。您的问题太广泛了,您没有说明实际的问题是什么。保持它们打开或关闭文件-这是您的全部设计决策,取决于此类“调用”的频率。有多少这样的对象(dat_C++_Io - Fatal编程技术网

C++ 正是时候。这是我想避免的事情。PS:目前,outputInterface和dataClassBase之间没有关系。您的问题太广泛了,您没有说明实际的问题是什么。保持它们打开或关闭文件-这是您的全部设计决策,取决于此类“调用”的频率。有多少这样的对象(dat

C++ 正是时候。这是我想避免的事情。PS:目前,outputInterface和dataClassBase之间没有关系。您的问题太广泛了,您没有说明实际的问题是什么。保持它们打开或关闭文件-这是您的全部设计决策,取决于此类“调用”的频率。有多少这样的对象(dat,c++,io,C++,Io,正是时候。这是我想避免的事情。PS:目前,outputInterface和dataClassBase之间没有关系。您的问题太广泛了,您没有说明实际的问题是什么。保持它们打开或关闭文件-这是您的全部设计决策,取决于此类“调用”的频率。有多少这样的对象(dataClassBase)将被存储?好吧,我的决定是,我希望保持文件打开,因为输出操作非常频繁。目前大约需要处理10种不同的数据类型,这当然可以通过在我的界面中明确区分不同的类型来实现,但我希望能够灵活地改变数据类型的数量,添加新的数据类型等。是的


正是时候。这是我想避免的事情。PS:目前,
outputInterface
dataClassBase
之间没有关系。您的问题太广泛了,您没有说明实际的问题是什么。保持它们打开或关闭文件-这是您的全部设计决策,取决于此类“调用”的频率。有多少这样的对象(dataClassBase)将被存储?好吧,我的决定是,我希望保持文件打开,因为输出操作非常频繁。目前大约需要处理10种不同的数据类型,这当然可以通过在我的界面中明确区分不同的类型来实现,但我希望能够灵活地改变数据类型的数量,添加新的数据类型等。是的,但这并不能解决持久打开的文件句柄的问题,不是吗?如果我按照您的建议将输出例程放入数据类中,那么每次都会打开和关闭输出文件。这是我想避免的事情。PS:目前,
outputInterface
dataClassBase
之间没有关系。您的问题太广泛了,您没有说明实际的问题是什么。保持它们打开或关闭文件-这是您的全部设计决策,取决于此类“调用”的频率。有多少这样的对象(dataClassBase)将被存储?好吧,我的决定是,我希望保持文件打开,因为输出操作非常频繁。目前大约需要处理10种不同的数据类型,这当然可以通过在我的界面中明确区分不同类型来实现,但我希望能够灵活地改变数据类型的数量,添加新的数据类型等。感谢您的建议。这种方法的缺点是灵活性非常有限。我必须为每个数据对象显式地包含一个ofstream对象和重载函数(大约10个)。这似乎有点尴尬。。并且在添加新数据类型但忽略对OutputInterface进行调整时可能会产生问题。但也许这真的是最简单的方法。更新的概念看起来很有希望,我目前正在测试它。带有基于typeid的map容器的部件为我提供了所需的灵活性。我将它与#James Kanze(使用type#u索引或其自定义实现)的思想相结合,并尝试使用指向基类的指针来实现WriteData,而不是使用模板。感谢您的建议。这种方法的缺点是灵活性非常有限。我必须为每个数据对象显式地包含一个ofstream对象和重载函数(大约10个)。这似乎有点尴尬。。并且在添加新数据类型但忽略对OutputInterface进行调整时可能会产生问题。但也许这真的是最简单的方法。更新的概念看起来很有希望,我目前正在测试它。带有基于typeid的map容器的部件为我提供了所需的灵活性。我将它与#James Kanze(使用类型索引或其自定义实现)的思想相结合,我将尝试使用指向基类的指针来实现WriteData,而不是使用模板。感谢您指出使用基于类型信息的键映射的可能性。C++11还不是一个选项(主要使用GCC4.4),但我从建议的GCC4.6类型索引实现中提取了相关部分。我将把它与#Mythli提出的框架结合起来。感谢您指出了使用基于类型#信息的键映射的可能性。C++11还不是一个选项(主要使用GCC4.4),但我从建议的GCC4.6类型索引实现中提取了相关部分。我将把它与#Mythli提出的框架结合起来。
#ifndef OUTPUTINTERFACE?H   
#define OUTPUTINTERFACE?H

#include <string>
#include <fstream>
#include <map>

class DataClass
{
public:
    virtual bool WriteData(std::ofstream& FStream) = 0;
};
class DataClass1 :
    public DataClass
{    
    virtual bool WriteData(std::ofstream& FStream)
    {
        FStream << "teletubbies";
    }
};    
class DataClass2 :
    public DataClass
{
    virtual bool WriteData(std::ofstream& FStream)
    {
        FStream << "garbage";
    }
};


class OutputInterface
{
public:
    OutputInterface()
    {
    }
    ~OutputInterface()
    {
        //Release stream pointers
    }
    template<typename T>
    bool WriteData(T& Data)
    {
        std::string dClassUID = std::string(typeid(T).name);
        tFStreamMap::iterator it this->streamMap.find(dClassUID);
        std::ofstream* stream = NULL;

        if(it != streamMap.end())
        {
            stream = it->second;
        }
        else
        {
            stream = new std::ofstream();
            stream->open(dClassUID + ".txt");
            streamMap.insert(std::make_pair(dClassUID, stream));
        }

        Data.WriteData(stream);
    }
private:
    typedef std::map<std::string, std::ofstream*> tFStreamMap;
    tFStreamMap streamMap;
};    

#endif
std::ostream*& destPtr = outputMap[typeid(*data)];
if ( destPtr == NULL ) {
    destPtr = new std::ofstream("...");
}
std::ostream& dest = *destPtr;