c++.stlsoft - [COMSTL; Adi's report] stlsoft::interface_ptr is a zombie; use stlsoft::ref_ptr
- Matthew (17/17) Dec 01 2006 Adi
- Adi Shavit (45/45) Dec 03 2006
- Adi Shavit (74/74) Dec 05 2006
- Matthew (87/87) Dec 05 2006 charset="iso-8859-1"
- Adi Shavit (107/107) Dec 05 2006
Adi comstl::interface_ptr<> is obsolete. It offers nothing that stlsoft::ref_ptr<> does not; it actually offers less. I don't know why this component has continued to be available. I've just grepped all my sources and can find only a single use of it (which I've just changed). My apologies for having left it in there. The preferred approach is to use stlsoft::ref_ptr<>. Why? Because it facilitates forward declaration of a smart pointer specialisation. (I'm working on a small article to explain how/why, which I hope to publish - perhaps on CodeProject - soonish.) I'm changing comstl/smartptr/interface_ptr.hpp as we speak to issue a warning if included, and will redefine the class to be implemented in terms of stlsoft::ref_ptr<>. Sorry about that ... :$ Matthew And now to the next question ...
Dec 01 2006
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type"> </head> <body dir="ltr" bgcolor="#ffffff <p style="margin-bottom: 0cm; margin-top: 0pt;"><font size="-1"><font face="Verdana">I wasn't even aware of ref_ptr.</font></font></p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"><font face="Verdana">I'll try it and let you know how it goes.<br> </font></span><span style="font-size: 13px;"></span></p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"><font face="Verdana">Adi</font></span><br> </p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"></span><br> </p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"></span></p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><br> Matthew wrote:<br> </p> <blockquote cite="midekrbio$313n$1 digitaldaemon.com" type="cite"> <pre wrap="">Adi comstl::interface_ptr<> is obsolete. It offers nothing that stlsoft::ref_ptr<> does not; it actually offers less. I don't know why this component has continued to be available. I've just grepped all my sources and can find only a single use of it (which I've just changed). My apologies for having left it in there. The preferred approach is to use stlsoft::ref_ptr<>. Why? Because it facilitates forward declaration of a smart pointer specialisation. (I'm working on a small article to explain how/why, which I hope to publish - perhaps on CodeProject - soonish.) I'm changing comstl/smartptr/interface_ptr.hpp as we speak to issue a warning if included, and will redefine the class to be implemented in terms of stlsoft::ref_ptr<>. Sorry about that ... :$ Matthew And now to the next question ... </pre> </blockquote> </body> </html>
Dec 03 2006
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type"> </head> <body bgcolor="#ffffff <font face="Verdana">I see that ref_ptr doesn't have a set() method.<br> How can I implement the code I posted before:<br> </font> <blockquote><font face="Courier New, Courier, monospace"> // Create a source filter specified by filename<br> interface_ptr<IBaseFilter> pSource; // The interface_ptr<> object<br> {<br> IBaseFilter* ppSource= NULL; // temporary bare pointer<br> <br> <br> if(FAILED(pGraph->AddSourceFilter(a2w(c_str_ptr(filename)),0,&ppSource)))<br> {<br> //...<br> return 0;<br> }<br> pSource.<u><b>set</b></u>(ppSource, false); // setting the smart pointer.<br> } <br> </font></blockquote> <font face="Verdana">Am I missing something??<br> <br> Adi<br> </font><br> Adi Shavit wrote: <blockquote cite="mid4572E9F7.7040801 gentech.co.il" type="cite"> <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type"> <p style="margin-bottom: 0cm; margin-top: 0pt;"><font size="-1"><font face="Verdana">I wasn't even aware of ref_ptr.</font></font></p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"><font face="Verdana">I'll try it and let you know how it goes.<br> </font></span><span style="font-size: 13px;"></span></p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"><font face="Verdana">Adi</font></span><br> </p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"></span><br> </p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><span style="font-size: 13px;"></span></p> <p style="margin-bottom: 0cm; margin-top: 0pt;"><br> Matthew wrote:<br> </p> <blockquote cite="midekrbio$313n$1 digitaldaemon.com" type="cite"> <pre wrap="">Adi comstl::interface_ptr<> is obsolete. It offers nothing that stlsoft::ref_ptr<> does not; it actually offers less. I don't know why this component has continued to be available. I've just grepped all my sources and can find only a single use of it (which I've just changed). My apologies for having left it in there. The preferred approach is to use stlsoft::ref_ptr<>. Why? Because it facilitates forward declaration of a smart pointer specialisation. (I'm working on a small article to explain how/why, which I hope to publish - perhaps on CodeProject - soonish.) I'm changing comstl/smartptr/interface_ptr.hpp as we speak to issue a warning if included, and will redefine the class to be implemented in terms of stlsoft::ref_ptr<>. Sorry about that ... :$ Matthew And now to the next question ... </pre> </blockquote> </blockquote> </body> </html>
Dec 05 2006
charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable You use conversion constructor and copy assignment, as in: interface_ptr<IBaseFilter> pSource; // The interface_ptr<> object { IBaseFilter* ppSource=3D NULL; // temporary bare pointer = if(FAILED(pGraph->AddSourceFilter(a2w(c_str_ptr(filename)),0,&ppSource)))= { //... return 0; } pSource =3D interface_ptr<IBaseFilter>(ppSource, false); // = setting the smart pointer. }=20 But since, in your code, you've not used a typedef (I would usually = define IBaseFilter_ptr) this looks like more of a burden than I'm used = to. There's no reason why you should do the typedef thing, of course. btw, I would normally do this differently, as in: { IBaseFilter* ppSource=3D NULL; // temporary bare pointer = if(FAILED(pGraph->AddSourceFilter(a2w(c_str_ptr(filename)),0,&ppSource)))= { //... return 0; } else { interface_ptr<IBaseFilter> pSource(ppSource, false); // = setting the smart pointer. . . . } }=20 But again, there's no reason why you _must_ follow the way I do it. So = it looks like a set() method's called for. (As you'll probably have = picked up on by now, I don't like adding _any_ functionality until it's = proven to be needed. But, once it's proven, well ...) I'll make this change now, and it'll be in beta 31 (31!). That should be = available in the next 36 hrs, maybe sooner. ;-) Cheers Matthew "Adi Shavit" <adish gentech.co.il> wrote in message = news:4575C6FD.9060408 gentech.co.il... I see that ref_ptr doesn't have a set() method. How can I implement the code I posted before: // Create a source filter specified by filename interface_ptr<IBaseFilter> pSource; // The interface_ptr<> = object { IBaseFilter* ppSource=3D NULL; // temporary bare pointer = if(FAILED(pGraph->AddSourceFilter(a2w(c_str_ptr(filename)),0,&ppSource)))= { //... return 0; } pSource.set(ppSource, false); // setting the smart pointer. }=20 Am I missing something?? Adi Adi Shavit wrote:=20 I wasn't even aware of ref_ptr. I'll try it and let you know how it goes. Adi Matthew wrote: Adi comstl::interface_ptr<> is obsolete. It offers nothing that stlsoft::ref_ptr<> does not; it actually offers less. I don't know why this component has continued to be available. I've just grepped all my sources and can find only a single use of it (which I've = just changed). My apologies for having left it in there. The preferred approach is to use stlsoft::ref_ptr<>. Why? Because it facilitates forward declaration of a smart pointer specialisation. (I'm working on a small article to explain how/why, which I hope to publish - perhaps on CodeProject - soonish.) I'm changing comstl/smartptr/interface_ptr.hpp as we speak to issue a warning if included, and will redefine the class to be implemented in = terms of stlsoft::ref_ptr<>. Sorry about that ... :$ Matthew And now to the next question ...
Dec 05 2006
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type"> <title></title> </head> <body bgcolor="#ffffff <font face="Verdana">See below...</font><br> <br> Matthew wrote: <blockquote cite="midel4iik$1rnv$1 digitaldaemon.com" type="cite"> <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"> <meta content="MSHTML 6.00.2800.1578" name="GENERATOR"> <style></style> constructor and copy assignment, as in:</font></div> <div> </div> face="Courier New" size="3"> interface_ptr<IBaseFilter> pSource; // The interface_ptr<> object<br> {<br> IBaseFilter* ppSource= NULL; // temporary bare pointer<br> <br> <br> if(FAILED(pGraph->AddSourceFilter(a2w(c_str_ptr(filename)),0,&ppSource)))<br> {<br> //...<br> return 0;<br> }<br> pSource = <strong>interface_ptr<IBaseFilter></strong>(ppSource, false); // setting the smart pointer.<br> } </font><br> </font></div> code, you've not used a typedef (I would usually define <strong>IBaseFilter_ptr</strong>) this looks like more of a burden than I'm used to.</font></div> <div> </div> why you should do the typedef thing, of course.</font></div> </font></div> </blockquote> <font face="Verdana">Yes, I guessed that was how you intended it to be used, though it seems to give the wrong impression, it feels odd.<br> </font> <blockquote cite="midel4iik$1rnv$1 digitaldaemon.com" type="cite"> <div> </div> btw, I would normally do this differently, as in:</font></div> <div> </div> face="Courier New" size="3"> {<br> IBaseFilter* ppSource= NULL; // temporary bare pointer<br> <br> <br> if(FAILED(pGraph->AddSourceFilter(a2w(c_str_ptr(filename)),0,&ppSource)))<br> {<br> //...<br> return 0;<br> }</font></font></div> face="Courier New" size="3"> else</font></font></div> face="Courier New" size="3"> {</font></font></div> <div><font face="Courier New"> <strong>interface_ptr<IBaseFilter></strong> face="Courier New" size="3">(ppSource, false); // setting the smart pointer.</font></font></div> <div> </div> New"> . . .</font></div> face="Courier New" size="3"> }</font></font></div> face="Courier New" size="3"> } </font><br> </font></div> <div> </div> </blockquote> <font face="Verdana">That's relevant only if pSource is used within the scope of the else.<br> If pSource external (e.g. a member), you would still need a set()[-like] mechanism.<br> <br> </font> <blockquote cite="midel4iik$1rnv$1 digitaldaemon.com" type="cite"> no reason why you _must_ follow the way I do it. S</font><font you'll probably have picked up on by now, I don't like adding _any_ functionality until it's proven to be needed. But, once it's proven, well ...)</font></div> <div> </div> change now, and it'll be in beta 31 (31!). That should be available in the next 36 hrs, maybe sooner. ;-)</font></div> </blockquote> <font face="Verdana">BTW, if the set/ctor would throw for a NULL ptr in this example, the if check would be unnecessary (assuming it is part of a bigger try-catch block), and the code would be more readable.<br> <br> Adi<br> <br> </font> </body> </html>
Dec 05 2006