C++ 为什么Glibmm/Gtkmm不包括Glib::RefPtr的一元解引用运算符*?
Glib::RefPtr允许通过“C++ 为什么Glibmm/Gtkmm不包括Glib::RefPtr的一元解引用运算符*?,c++,gtk,smart-pointers,glib,gtkmm,C++,Gtk,Smart Pointers,Glib,Gtkmm,Glib::RefPtr允许通过“->”取消引用,但不允许通过“*”取消引用。为什么会这样 我当然可以做到: class Foo {}; Glib::RefPtr<Foo> fooPtr; fooPtr.operator->(); class Foo{}; 油嘴滑舌:RefPtr fooPtr; 操作员->(); 文件中特别提到他们遗漏了操作员*()。但他们没有提供任何关于原因的指导 为清晰起见,使用示例进行编辑: 我看到有人争辩说“您永远不应该取消引用”RefPt
->
”取消引用,但不允许通过“*
”取消引用。为什么会这样
我当然可以做到:
class Foo {};
Glib::RefPtr<Foo> fooPtr;
fooPtr.operator->();
class Foo{};
油嘴滑舌:RefPtr fooPtr;
操作员->();
文件中特别提到他们遗漏了操作员*()。但他们没有提供任何关于原因的指导
为清晰起见,使用示例进行编辑:
我看到有人争辩说“您永远不应该取消引用”RefPtr,但这似乎是违反直觉的,因为任何想要与动态和堆栈分配对象一起使用的函数都需要最低的公共分母接口,即按引用传递
例如,以以下示例为例:
struct Foo
{
void print() { printf( "Success" ); }
};
void myFunc( const Foo & foo ) { foo.print(); }
int main()
{
Foo foo0;
Glib::RefPtr<Foo> foo1Ptr( new Foo );
myFunc( foo0 );
myFunc( *foo1Ptr ); // error, no operator*()
return 0;
}
structfoo
{
void print(){printf(“Success”);}
};
void myFunc(const Foo&Foo){Foo.print();}
int main()
{
富富0;
Glib::RefPtr foo1Ptr(新Foo);
myFunc(foo0);
myFunc(*foo1Ptr);//错误,无运算符*()
返回0;
}
有人知道为什么这个职位由能说会道的团队担任吗
某些函数可能将对象或对象引用作为参数
否,如果一个对象应该通过RefPtr使用,那么没有RefPtr,任何函数都不会(或任何函数都不应该)接受它。没有operator*可以避免人们这样做,这意味着API必须是正确的,这意味着由于不使用RefPtr而导致的内存管理错误更少。它不存在是因为人们会滥用它,而且人们已经很难掌握smartpointers的窍门了
如果您有一个您认为可以通过RefPtr::operator*()解决的实际问题,那么您可以提到实际问题,这样我们就可以(可能)展示您不想使用operator*()那里。通过查看该智能指针的文档,GLib团队似乎从未打算将其用于除具有成员变量和函数的类类型之外的任何其他类型。如果您需要指向非类类型的指针,那么std::unique\u ptr或std::shared\u ptr更适合使用。如果一个函数接受的对象很好,->操作符返回指向的类型,它的函数可以像类类型一样访问,具有正常的指针语义。这并不影响函数接受或返回的参数。也就是说,标准智能指针缺少运算符*(),而是有一个get()成员函数,允许访问包含的指向类型。@jonathon:哪些标准智能指针缺少
运算符*()
auto_ptr
、unique_ptr
和shared_ptr
都有这个操作符,而Weake_ptr
之所以缺少它,只是因为它并不意味着可以被取消引用。@CrazyEddie Murray Cumming:@murrayc有时会在这里回答,也许他可以启发我们。谢谢您的回复。也许我错了,但我的理解是,某些类型是动态有效分配的,有时也可能在堆栈上有效分配。在我看来,要同时允许这两种情况,必须使用引用传递。不,没有glibmm或gtkmm类型可以同时使用(有RefPtr或没有RefPtr)。如果您看到任何其他建议,请务必让我们知道,以防您刚刚发现一个bug。当然,其他GTKMM类型(不应该通过RefpTR),如WIDGET,可以动态地分配,也可以在堆栈上分配,就像任何其他C++类一样。我感到困惑的是,我一直在使用RefpTR来自定义类型,以避免使用几种类型的智能PoTeNe.GueTHE,您不应该通过RefPtrs存储小部件。如果小部件是顶级小部件(例如,窗口或对话框),那么unique\u ptr可能确实很有用,但子小部件是创建和管理的(请参阅Gtk::manage()。Gtk::Builder::get_widget()文档提到: