【问题标题】:C++ derive from a native typeC++ 派生自本机类型
【发布时间】:2009-07-26 02:03:45
【问题描述】:

在一些 C++ 代码中,我使用整数来存储大量变化的数据。 为了分析我的程序,我想记录一些变量的某些更改,例如某个值被分配的频率,以及该分配的冗余频率(新值与旧值相同。)

如果类型是 Foo 类,我只需派生一个新的 LoggingFoo 并将我的日志记录数据添加到我感兴趣的成员函数中,然后调用父成员函数。 我必须更新我的代码以使用新类型,但只要我最初与 typedefs 一致,那就是一行更改。

我的问题是我要添加日志记录的变量是一个 int。您不能从 C++ 中的内置类型派生(可以吗?)

我的问题是是否有从基本类型(int、float、double 等)派生的聪明方法。

解决方案可能是定义一个 有效 是 int 的新类。它定义了 每个 int 可以执行的操作,并将该操作应用于私有 int数据成员。 这种策略会奏效,但也许其他人已经制作了这样的类,我可以只使用“fakeint.h”头文件定义。在我自己实现它们之前,是否已经有这样的“代理本机类包装器”类型定义可用?

我当然意识到我的代理 int 不能与 int 互换使用,特别是因为现有的函数定义都需要一个 int.. 但对于我的应用程序来说,这一切都在一个内部循环中,它正在做很多简单的原生+-*^= 操作,不用作函数参数或任何东西。

【问题讨论】:

  • 你应该看看 boost 的操作符:boost.org/doc/libs/1_39_0/libs/utility/operators.htm。它可以让你创建一个包含所有典型运算符的类,使其表现得像本机整数类型。
  • @Evan.. 谢谢,总的来说这是一个很好的资源!对我需要的东西过度杀伤,但如果我确实需要自己动手,它会大大减少多余的工作。

标签: c++ class


【解决方案1】:

你不能从 int 派生一个类,但你应该能够通过从 Advanced C++: Programming Styles and Idioms 实现 Coplein 的具体数据类型习语然后重载来创建一个可与 int 互换的类(例如 Integer)从Integerint 的类型转换运算符并定义从intInteger 的转换运算符。

这里是另一个链接,描述了书中的基本Idioms

还有一个我认为与您正在寻找的链接非常接近的链接http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Int-To-Type

【讨论】:

    【解决方案2】:

    这样的……

    template <typename T> class logging_type
    {
    private:
       T value;
    public:
       logging_type() { }
       logging_type (T v) : value(v) { }  // allow myClass = T
       operator T () { return value; }  // allow T = myClass
       // Add any operators you need here.
    };
    

    这将创建一个可双向转换为原始类型的模板类。您需要为代码中该类型上使用的每个操作添加日志记录处理和重载运算符。

    这仍然可能不是您想要的,因为它可以隐式转换为 int(或您指定的任何类型),因此您的代码可能会默默地将您的日志转换为 int 并且您会留下不完整的日志。您可以通过向构造函数添加一个“显式”关键字来防止这种情况发生,但您不能对转换运算符执行任何类似的操作。除非您将其设为私有...我没有尝试过。但是,做这些事情中的任何一个都会在某种程度上破坏目标。

    编辑:从 c++11 开始,您可以explicit 添加到转换运算符。

    【讨论】:

    • 这感觉非常有前途.. 它的吸引力在于默认情况下一切正常,我需要包装的唯一函数是我想要处理自定义日志记录的函数。它几乎有效!我=我+1;没关系。 cout
    【解决方案3】:

    这实际上是 #define 非常有用的一种情况。 我推荐

    #ifdef DEBUG
    #    define INTGR MyDebugIntegerClass
    #else
    #    define INTGR int
    #endif
    

    确保 MyDebugIntegerClass 可以将自身转换为常规 int,并具有所有适当的运算符。然后,使用 INTGR 编写代码。

    在调试模式下,您将获得类的所有日志记录,但在发布模式下,您将获得一个普通的 int。

    【讨论】:

    • 是的,我已经有了 typedef,所以它更容易。我的主要问题是有效地构建 MyDebugIntegerClass 而无需手动包装 50 多个本机 int 运算符。 (或者只是找一个已经做过的人。)
    【解决方案4】:

    你永远不能从原始类型派生

    【讨论】:

    • 是的,但还有其他事情可以做,这可能就是你得到反对票的原因(来自其他人)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多