gpt4 book ai didi

c++ - 设计问题 (C++)

转载 作者:行者123 更新时间:2023-11-28 01:47:17 25 4
gpt4 key购买 nike

如果我没有在正确的 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 类型变量并根据给定的 T 分配内存或将其初始化为 OneTwo

此外,我正在考虑创建名为 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 在上面的例子中)并且可能有更多遵循相同接口(interface)的类实现相同的操作(doSomething(... ) 在上面的例子中),但是对于每个类,该操作的给定数据是不同的。

此外,我想为所有这些类(上例中的 class OneTwo)提供一个单一接口(interface),以便于使用。

最佳答案

这是一个接近完成您所要求的设计,希望当您看到它时,您会明白您所要求的在逻辑上是不一致的,就像在欧几里得空间中要求一个圆半径与直径之比为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 随心所欲.但是如果你给它错误的类类型,它实际上是因为它会抛出异常,你就会有祸了。

现在,你如何解决这个问题?好吧,你不能。 One 类的 doSomething 必须有一个 OneDataTwo 类必须有一个 TwoData 但如果你有一个 Base *,你不知道你有哪个。

也许您可以问一个不同的问题。因为导致你问这个没有答案的废话问题的思路留在了某个地方。这就是它需要回到正轨的地方。是什么让您相信自己想要做这件毫无意义的事情?

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com