C ++派生自本机类型

时间:2009-07-26 02:03:45

标签: c++ class

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

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

我的问题是我想要添加日志记录的变量是一个int。你无法从C ++中的内置类型派生出来(可以吗?)

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

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

我确实意识到我的代理int不能与int互换使用,特别是因为现有的函数定义都期望一个int ..但对于我的app,这都是在一个内部循环中,它做了很多简单的本机+ - * ^ =操作,不用作函数参数或任何东西。

4 个答案:

答案 0 :(得分:9)

你不能从int派生一个类,但是你应该能够通过实现Coplein的具体数据类型成语{{3来创建一个可与Integer互换的类(例如int)然后将类型转换运算符从Integer重载到int,并定义从intInteger的转换运算符。

这是另一个描述书中基本Advanced C++: Programming Styles and Idioms的链接

我认为另一个链接非常接近您所寻找的Idioms

答案 1 :(得分:8)

像这样......

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(或您指定的任何类型),因此您的代码可能会将您的logging int静默转换为int,并且您将留下不完整的日志。您可以通过向构造函数添加“explicit”关键字来向一个方向阻止此操作,但您无法对转换运算符执行任何类似操作。除非你把它私有化......我还没试过。尽管如此,做其中任何一件事都会失败。

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

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:-1)

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