我知道如何重载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
答案 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类型不是指针。这将是一些m
或struct
重载class
。
这样的类可能只是operator->
或unique_ptr
的薄包装,而shared_ptr
可能会返回->
。
最愚蠢的方法是
&(ptr.get()->db)
使你的“我希望这个工作”代码完全按原样运行,但有更多聪明的方法可以做到这一点(这可能涉及对你的“我希望这个工作”代码的轻微调整)
1 在C ++中,智能指针是任何类似于指针的类型,但在某种程度上以合理的方式比原始指针更“智能”。也许它只是穿着一件华丽的西装; C ++在调用“智能”指针方面不是很精英。
答案 1 :(得分:1)
规则是:
如果
x->m
存在并且运算符被选为最佳运算符,则表达式(x.operator->())->m
将被解释为x
类T
类对象T::operator->()
通过重载解析机制匹配函数
和
当运营商 - &gt;返回,运营商 - &gt;应用于该值 返回,使用原始的第二个操作数。
更容易理解:只有.operator->()
的链式调用可以缩减为单个->
,然后指针的以下解引用也会“减少”。
因此,在这种情况下,只需更改instance
函数即可返回DatabaseManager&