如果我没有在正确的Stack Overflow论坛中提出这个问题,请事先道歉。我正在尝试提出一种易于扩展且易于使用的设计。所以这是我的问题:

在C ++中,我有两个类,分别称为Class OneClass 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类型的变量。我被迫使用OneTwo作为类型,这迫使我定义2个变量(我真正想要的是创建Base类型变量并分配内存或将其初始化为基于OneTwo的类型在给定的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, ...
    }
};


我不确定即使对类OneTwo采取了正确的方法。另外,我试图解释得尽可能清楚,但请问是否有人需要更多信息。

请帮我了解如何设计?

谢谢,



更新:

简而言之,我希望至少有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,并根据需要给它一个OneDataTwoData。但是如果您为类提供的类型错误实际上是您的不幸,因为它会引发异常。

现在,您如何解决该问题?好吧,你不能。 doSomething类的One必须具有OneData,而Two类的必须具有TwoData,但是如果您具有Base *,则您不知道拥有哪个。

也许您可以改问另一个问题。因为导致您问这个毫无意义的废话的思路。这就是需要将其放回正轨的地方。是什么让您相信您想要做的这件事没有道理?

关于c++ - 设计问题(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44533667/

10-12 23:00