只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
Only know data type at run time. How to hide data details to other classes which use them
基本上,我必须使用以下语法基于输入文本文件填充对象:
float 4.55 24 2.1
int 4 6 9 0
float 5.1 6 6
//char 255 3 5
然后我需要对它们进行某种操作(例如一个简单的adion(——事先无法知道会有哪些类型的数据
我不能把它们都作为双变量存储在内部,因为空间优化很重要,而且不会失去精度。
我想做一些类似的事情:
class Base {
public:
virtual size_t size() = 0;
virtual void addValue () = 0;
virtual void getValue (int index) = 0;
};
class BaseFloat : public Base{
public:
vector<float> data;
void addValue (float d);
float getValue (int index);
size_t size();
}
class BaseInt : public Base{
public:
vector<int> data;
void addValue (int d);
Int getValue (int index);
size_t size();
}
/* other classes for each data type here*/
这不起作用,因为每个函数都有不同的返回类型或参数需求;
然后我有一个类,它为每一行创建正确的对象。
当我需要其他类来处理任何类型的Base时,问题就来了。我在想:
class OtherClass {
public:
void addValue(Base*, double);
}
OtherClass my_class; //whatever
Base* a = new BaseFloat ();
Base* b = new BaseInt();
my_class.addData(a, 5.56); //Uses BaseFloat::addValue
my_class.addData(b, 6); //Uses BaseInt::addValue
my_class.addData(b, 6.55); //Uses BaseInt::addValue
我希望我能做到这一点,而不添加任何长的"如果不是"条款类似:
void OtherClass::addDataHelper (Base* pointer)
if (subclass(pointer) == float)
//Do BaseFloat* a = pointer;
//Do a->addValue
else if ...
有什么想法吗?
创建OO设计时,需要定义基类的接口,这样所有派生类都可以覆盖虚拟函数,而无需更改签名。例如,对于读取数据,它可以实现为:
class BaseData {
public:
virtual bool addValue( std::istream &in ) = 0;
};
class DataFloat : public BaseData {
virtual bool addValue( std::istream &in ) override
{
float v = 0;
if( not in >> v ) return false;
data_.push_back( v );
return true;
}
private:
std::vector<float> data_;
};
class Factory {
public:
std::unique_ptr<BaseData> create( const std::string &type );
};
std::vector<std::unique_ptr<BaseData>> parsing( std::istream &in, Factory &f )
{
std::vector<std::unique_ptr<BaseData>> v;
std::string str;
while( std::getline( in, str ) ) {
std::istringstream line( str );
std::string type;
if( not in >> type ) continue;
auto pbase = f.create( type );
while( pbase->addValue( in ) );
v.push_back( std::move( pbase ) );
}
return v;
}
当然,这不是完整的代码,但应该足以展示这个想法。因此,对于您的操作,您需要做同样的事情——找到在基类中定义虚拟函数的方法,这样它就可以在每个派生函数中重新实现,而无需更改签名。每个类都有void addValue( int data )
或void addValue( float data )
的方法不是正确的OO设计,会导致if
与dynamic_cast
级联或类似的方法。
另一个解决方案是将数据保存在std::vector<std::variant<int,float,char,double>>
中(列出了所有必要的类型(,并编写适当的访问者来进行数据插入和计算等。互联网上有很多关于如何正确执行这一操作的材料,如果将它们添加到此处,将超出本答案的范围。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 结构和双指针隐藏在其他结构中,多层混淆
- 只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
- 是否可以从其他线程隐藏qt小部件窗口
- 为什么使用std::swap不会在外部范围中隐藏其他交换函数
- 隐藏 QWidget,防止其他 QWidget
- 如何在不擦除 Windows 上C++中的其他属性的情况下隐藏/取消隐藏文件
- 扩展类以进行调试:公共API、隐藏实现或其他什么
- 将其他运算符隐藏一段时间
- Operator< & lt;重载隐藏其他
- 如何对其他用户隐藏一个秘密
- 在g++中我可以访问哪些其他隐藏变量(使用宏预先定义的)?
- 如何向其他子系统隐藏类
- C++ - 如何隐藏其他应用程序的窗口