【问题标题】:C++ operator overloading for wrapper class包装类的 C++ 运算符重载
【发布时间】:2015-06-10 10:11:37
【问题描述】:

我正在使用一个名为 Pointer 的类,我猜它是一种围绕真实指针的包装器。我认为这个类中的这行代码可以让我得到真正的指针:

 operator const T* () const;

这到底是什么意思?这个怎么称呼?

假设myPointer 是一个Pointer<int16_t> 对象。通过使用上面的运算符重载,我应该能够获得包装此指针的int_16* 对象,但我不知道如何。

编辑

根据下面的答案,我现在知道我可以做到这一点:

const int16_t* myRealPointer = myPointer;

现在假设我需要调用一个需要 int16_t* 参数的函数(所以没有 const)。我该怎么做才能将此 myRealPointer 对象传递给该函数?

【问题讨论】:

  • 您要查找的关键字是“隐式转换运算符”;您可以通过将myPointer 转换为int_16* 来触发它(假设还有该运算符的非常量版本),通过将其分配给int_16* 类型的对象,通过将其传递给期望对象为的函数输入int_16*,在其他一些我不记得的情况下。在实践中,隐式转换运算符使对象能够在您可能需要此类转换的最微小提示时衰减到目标类型。
  • 可能问题标题有误导性,还有标签
  • @Wolf 毫不犹豫地调整它

标签: c++ pointers operator-overloading wrapper


【解决方案1】:

这是一个转换运算符。例如,您可以使用它将 Pointer<T> 转换为 real T*,此外,在任何需要 T* 的地方使用它:

Pointer<float> p(new float);
const float* p2 = p;

在这种情况下,运算符只为转换为 const 原始指针而定义,因此 float* p2 = p; 将不起作用。 (对于这种情况,也可能有类似的运算符。)

【讨论】:

  • 唯一正确的答案。
  • 谢谢。现在假设我需要调用一个需要 int16_t* 参数的函数,并且我有一个 const int16_t* 对象。我该怎么做才能将此对象传递给该函数?
  • @Fortega 声明一个 int16_t 变量并将其地址传递给函数调用,另一种选择是将 const 转换掉,但这可能很危险。
【解决方案2】:

这不是您在问题标题中写的operator ()。它是一个隐式转换运算符,将Pointer&lt;T&gt; 类型的对象转换为T * 类型的对象。因此,在需要 T * 类型的对象的任何地方,您都可以使用 Pointer&lt;T&gt; 类型的对象。

例如

Pointer<int16_t> myPointer;

/* initialization of myPointer */

if ( myPointer != NULL ) std::cout << myPointer << std::endl;

在这段代码中,sn-p 操作符被调用了两次:在 if 条件和输出语句中。

如果您不想要这样的隐式转换,您可以使用函数说明符explicit 声明运算符。例如

explicit operator const T* () const;

如果你确实想写operator (),它的名字类似于函数调用运算符,那么它可以如下所示

const T * operator ()() const;

在这种情况下,上面的代码 sn-p 看起来会有所不同

Pointer<int16_t> myPointer;

/* initialization of myPointer */

if ( myPointer() != NULL ) std::cout << myPointer() << std::endl;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2011-11-22
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多