0

我有一系列 C++ 类,我希望它们在功能上都相同,但在其他方面与继承无关。实际上,这些类只会在名称上有所不同。(这些类将被抛出,我不希望某些基类的 catch 子句吞噬抛出的派生对象。会有派生类,但我希望创建始终隔离的离散类集,只要关注块。)

当然,这样做的缺点是复制源代码。每当需要更改某些内容时,我不想更新相同代码的 N 个副本。

我已经通过#define 解决了代码重复问题。但我认为,如果我可以利用模板,它将有助于调试能力。模板中唯一参数化的就是类名本身。

我尝试了以下方法,但在 gcc 中不起作用(启用了 c++0x 支持):

template<typename ClassName>
class ClassName
{
  public:
    ClassName(int foo, float bar) { ... }
   ~ClassName() { ... }

   bool SomePublicMethod() { ... }

  private:
    ...
}

然后我会用类似的东西声明实际的类:

typedef ClassName<UnrelatedClass1> UnrelatedClass1;
typedef ClassName<UnrelatedClass2> UnrelatedClass2;

我已经知道上述方法不起作用;我将它作为我想要完成的概念示例提供,并且想知道除了我目前使用的#define 宏方法之外是否有其他方法可以使它工作(它的调试能力降低了。 )

4

3 回答 3

3

使用价值专用模板:

template<int ID>
class ClassName
{
  public:
    ClassName(int foo, float bar) { ... }
   ~ClassName() { ... }

   bool SomePublicMethod() { ... }

  private:
    ...
}

typedef ClassName<1> UnrelatedClass1;
typedef ClassName<2> UnrelatedClass2;
于 2013-09-23T03:51:47.203 回答
0

这听起来根本不是一个好主意。

异常类应该捕获特定类型的错误,使用继承来更概括错误类型。

因此,例如,您可能有一个“磁盘崩溃异常”,更一般地说可能是“磁盘异常”,更一般地说是“io 异常”,其核心始终是“std::exception”

如果您的所有异常都捕获不同类型/类别的错误,那么为什么它们都具有相同类型的实现。

此外,在模板中混合使用#define 的情况也很少见,因为当出现编译器错误时,这总是会降低其可读性(即使在没有导致错误时它看起来更具可读性)。

也许你可以提供更多关于你的异常类中实现了什么的信息,我可以看看我是否可以进一步帮助你。

于 2013-09-23T03:53:53.527 回答
0

当他们说你应该使用继承时,我同意其他人的观点。它有很多用途(其中一个是您希望拥有类似课程的原因)。仅当对象相关时才编写派生类不是强制性的 - 即使只是匹配的功能也很好,因为您的想法确实是将相似的代码放在一起。

但是,由于您的查询是关于创建多个类并且我们对您的项目没有足够的了解,我相信您可能真的需要单独的类。一种方法是通过宏。这是一个示例:

#include <iostream>
using  std::cout;
using  std::endl;

#define CUSTOM_CLASS(_CL) class _CL\
{\
      public:\
                  _CL(int foo, float bar) { cout << "Creating instance with foo=" << foo << ";bar=" << bar << endl;}\
       ~_CL() { }\
       bool SomePublicMethod() { cout << "Class created\n"; }\
};

CUSTOM_CLASS(myclass1);
CUSTOM_CLASS(myclass2);

int main()
{
    myclass1 instance1(1, 1.3f);
    myclass2 instance2(2, 0.3f);
    return 0;
}

如果你使用 g++ 运行它,你将得到以下结果:

Creating instance with foo=1;bar=1.3
Creating instance with foo=2;bar=0.3
于 2013-09-23T05:01:29.513 回答