C ++类中的多个数据源

时间:2015-05-15 12:02:44

标签: c++ interface

我想知道如何将不同的数据源添加到现有代码中。例如,让我们说我有这段代码:

//DataFromFile.cpp

#include "Data.h"

class DataFromFile
{
public:
    DataFromFile() { filename = ""; }
    ~DataFromFile() { delete data; }
    void loadValue(const char *filename) { //getting data from a file }
    void printData() { data->printData(); }
private:
    string filename;
    Data *data;
};


//Source.cpp

#include <iostream>
#include "DataFromParameter.h"

int main(int argc, char **argv)
{
    DataFromFile oldData;
    oldData.loadValue("example.txt");
    oldData.printData();

   return 0;
}

并且需要创建类DataFromDatabase或DataFromParameter,但不改变DataFromFile的工作方式(此代码在各种程序中使用,并且无法通过其代码)。创建一个界面似乎是一个很好的方法,所以我提出了这个解决方案:

//IData.h

#include "Data.h"

class IData
{
public:
    IData() { data = NULL; }
    virtual ~IData() = 0 { delete data; }
    void printData() { if (data != NULL) data->printData(); }
protected:
    Data *data;
}

//DataFromParameter.h

#include "IData.h"

class DataFromParameter : public IData
{
public:
    DataFromParameter(const int value) { this->data = new Data(value); }
    ~DataFromParameter() {}
};


//DataFromFile.h

#include "IData.h"

class DataFromFile : public IData
{
public:
    DataFromFile() { filename = ""; }
    DataFromFile(const char *filename) { loadValue(filename); }
    ~DataFromFile() {}
    void loadValue(const char *filename) { //getting data from a file }
private:
    string filename;
}

正如您所看到的,IData和DataFromParameter是新类,我还向DataFromFile添加了一些方法。创建新对象并调用其方法:

//Source.cpp

#include <iostream>
#include "DataFromParameter.h"

int main(int argc, char **argv)
{
    //Source: file (the old way)
    DataFromFile oldData;
    oldData.loadValue("example.txt");
    oldData.printData();

    //Source: file (the new way)
    IData *newData1 = new DataFromFile("example.txt");
    newData1->printData();
    delete newData1;

    //Source: parameter
    IData *newData2 = new DataFromParameter(atoi(argv[1]));
    newData2->printData();
    delete newData2;

   return 0;
}

它有效,但我对此并不满意;特别是DataFromFile类代码看起来很乱 - 我知道为什么它看起来那样,但我相信其他人会非常困惑那里到底发生了什么。

我的问题是:有更好的方式去这里吗?是否有必要(考虑到情况)或者我是否错过了一些明显的问题解决办法?

0 个答案:

没有答案