如果我没有在正确的Stack Overflow论坛中提出这个问题,请事先道歉。我正在尝试提出一种易于扩展且易于使用的设计。所以这是我的问题:
在C ++中,我有两个类,分别称为Class One
和Class Two
,它们都支持称为doSomething(T& data)
的操作。 T
是一个struct
,例如对于Class One
具有两个成员,对于Class Two
具有四个成员。由于我想在这些类中强制使用doSomething(T& data)
,因此我有一个称为Base的基类。
template <class T>
class Base
{
typedef T data_type;
virtual bool doSomething(data_type& data) const = 0;
};
struct OneData { int a; int b; };
class One : public Base<OneData>
{
bool doSomething(data_type& data) const { ... }
};
struct TwoData { int a; float b; int c; char d; };
class Two : public Base<TwoData>
{
bool doSomething(data_type& data) const { ... }
};
这种方法的一个大问题是,我无法定义
Base
类型的变量。我被迫使用One
或Two
作为类型,这迫使我定义2个变量(我真正想要的是创建Base
类型变量并分配内存或将其初始化为基于One
或Two
的类型在给定的T
上)。此外,我正在考虑创建名为
OneTwo
的类,该类定义了doSomething(T& data)
,这基本上掩盖了从客户端创建哪个对象的麻烦。// This is just idea of what I want but don't know how??
template<class OneT, class TwoT>
struct OneTwo
{
bool doSomething(T& data) const // Here I don't know how to get to T
{
if (OneT::owns(data)) // call OneT::doSomething
else if (TwoT::owns(data)) // call TwoT::doSomething
else // Maybe exception, error, ...
}
};
我不确定即使对类
One
和Two
采取了正确的方法。另外,我试图解释得尽可能清楚,但请问是否有人需要更多信息。请帮我了解如何设计?
谢谢,
更新:
简而言之,我希望至少有2个类(以上示例中的
class One and Two
),并且可能有更多的类遵循相同的接口,从而实现相同的操作(以上示例中的doSomething(...)
),但是该操作给定的数据对于每个操作都是不同的类。此外,我想为所有这些类类(上例中的
class OneTwo
)提供一个接口,以简化使用。 最佳答案
这是一种接近完成您要求做的设计的方法,希望当您看到它时,您将了解您所要求的在逻辑上是不一致的,例如在欧几里德空间中要求一个比率的圆半径和直径之间是3。
#include <stdexcept>
struct OneData;
struct TwoData;
class Base {
public:
virtual bool doSomething(OneData &) const { throw ::std::runtime_error("I don't know how to operate on a OneData!"); }
virtual bool doSomething(TwoData &) const { throw ::std::runtime_error("I don't know how to operate on a TwoData!"); }
virtual ~Base() = 0 { } // Make this an abstract base class that can't be instantiated.
};
struct OneData { int a; int b; };
class One : public Base
{
virtual bool doSomething(OneData& data) const { return; }
};
struct TwoData { int a; float b; int c; char d; };
class Two : public Base
{
virtual bool doSomething(TwoData& data) const { return; }
};
现在,您可以拥有自己的
Base *
并对其心脏内容调用doSomething,并根据需要给它一个OneData
或TwoData
。但是如果您为类提供的类型错误实际上是您的不幸,因为它会引发异常。现在,您如何解决该问题?好吧,你不能。
doSomething
类的One
必须具有OneData
,而Two
类的必须具有TwoData
,但是如果您具有Base *
,则您不知道拥有哪个。也许您可以改问另一个问题。因为导致您问这个毫无意义的废话的思路。这就是需要将其放回正轨的地方。是什么让您相信您想要做的这件事没有道理?
关于c++ - 设计问题(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44533667/