如何使箭头解除引用操作符 - >()不重载固体对象而是指针

时间:2017-09-07 13:22:32

标签: c++ operator-overloading operators

我知道如何重载operator->对于实体(堆栈)对象(如智能指针)

#include <iostream>
struct A { void foo() {} };
struct B {
    A* pa;
    A* operator->() {
        return pa;
    }
};
int main() {
    B b;
    b->foo();  // b is SOLID object on stack: b.pa = ...
}

但我想要这个:

B * pb = new B();
pb->foo(); // to call my overload

我需要这个用于Database Manager Singleton设计:

class DatabaseManager
{
private:
    static DatabaseManager * sharedInstance_;
    sqdb::Db *db = nullptr;

public:
    static DatabaseManager * instance();
    sqdb::Db * operator->() {
        return db;
    }
}

我基本上想要这种行为

auto m = DatabaseManager::instance();
m->Query(...); // db->Query 

2 个答案:

答案 0 :(得分:1)

您无法替换指针上的#include <iostream> using namespace std; int main (){ int a, b, c, hasil; cout << "Masukkan Bilangan 1 : "; cin >> a; cout << "Masukkan Bilangan 2 : "; cin >> b; cout << "Masukkan Operator ['(0 = +)' , '(1 = -)' , '(2 = *)', '(3 = /)' ] : "; cin >> c; hasil = a + (c * -2 + 1 )* b; cout << "Hasilnya = " << hasil; }

您可以创建一个重载->的智能指针 1 ,但内置运算符可能不会过载。

->

这没问题,但是auto m = DatabaseManager::instance(); m->Query(...); // db->Query 的tye类型不是指针。这将是一些mstruct重载class

这样的类可能只是operator->unique_ptr的薄包装,而shared_ptr可能会返回->

最愚蠢的方法是

&(ptr.get()->db)

使你的“我希望这个工作”代码完全按原样运行,但有更多聪明的方法可以做到这一点(这可能涉及对你的“我希望这个工作”代码的轻微调整)

1 在C ++中,智能指针是任何类似于指针的类型,但在某种程度上以合理的方式比原始指针更“智能”。也许它只是穿着一件华丽的西装; C ++在调用“智能”指针方面不是很精英。

答案 1 :(得分:1)

规则是:

  

如果x->m存在并且运算符被选为最佳运算符,则表达式(x.operator->())->m将被解释为xT类对象T::operator->()通过重载解析机制匹配函数

  

当运营商 - &gt;返回,运营商 - &gt;应用于该值   返回,使用原始的第二个操作数。

更容易理解:只有.operator->()的链式调用可以缩减为单个->,然后指针的以下解引用也会“减少”。

因此,在这种情况下,只需更改instance函数即可返回DatabaseManager&