[Ipopt] Using smart pointers

Carl Laird carl.d.laird at gmail.com
Tue Jul 1 13:44:29 EDT 2008


Hi Krish,

I think that Stefan has answered this question already. In summary,
the C++ compiler is able to do implicit casting from a derived class
to a base class automatically. That is the following conversion from
derived to base will work fine:

DerivedClass* dc = new DerivedClass(...);
BaseClass *bc = dc;

However, the compiler does not automatically do the conversion for
SmartPtr's. That is the following will not work:

SmartPtr<DerivedClass> dc = new DerivedClass(...);
SmartPtr<BaseClass> bc = dc; // The compiler cannot perform the
implicit conversion

The GetRawPtr(dc) function returns a DerivedClass* from the SmartPtr.
Then the compiler can do the implicit conversion. Therefore, as Stefan
mentioned, the following does work:

SmartPtr<DerivedClass> dc = new DerivedClass(...);
SmartPtr<BaseClass> bc = GetRawPtr(dc); // GetRawPtr(dc) returns a
DerivedClass*, the compiler can implicitly convert that to a
BaseClass*


Hope this helps understand the code. We looked at some ways to have
SmartPtr<> allow this conversion automatically, but when supporting
multiple platforms, it was difficult to find a technique that all
compilers would support well.

Cheers all, and thanks for all the activity and contributions to the
IPOPT community,

Carl.


On Tue, Jul 1, 2008 at 9:02 AM, Krish Krishnan <rkrishnan8216 at yahoo.com> wrote:
> Hi All:
>
> I have a windows application using MFC to create an optimized portfolio of
> common stock.  I used the cpp example as a template and derived my class
> from TNLP.  The difference between my implementation and that in the example
> is that I have many new members and a few more functions (to access data in
> databases ) etc.
>
> When I try to compile this, the compiler complains that the new data members
> are not part of the TNLP class.  For example some of the error messages are
> below:
>
> rojects\bmopt\bmopt\createcase.cpp(262) : error C2039: 'm_caseFileName' : is
> not a member of 'Ipopt::TNLP'
> 1>        c:\optdir\iptnlp.hpp(48) : see declaration of 'Ipopt::TNLP'
> 1>c:\documents and settings\kris\my
> documents\projects\bmopt\bmopt\createcase.cpp(264) : error C2039:
> 'm_assetBoundsDB' : is not a member of 'Ipopt::TNLP'
> 1>        c:\optdir\iptnlp.hpp(48) : see declaration of 'Ipopt::TNLP'
> 1>c:\documents and settings\kris\my
> documents\projects\bmopt\bmopt\createcase.cpp(265) : error C2039:
> 'm_assetBoundsTable' : is not a member of 'Ipopt::TNLP'
> 1>        c:\optdir\iptnlp.hpp(48) : see declaration of 'Ipopt::TNLP'
> 1>c:\documents and settings\kris\my
> documents\projects\bmopt\bmopt\createcase.cpp(267) : error C2039:
> 'm_assetReturnDB' : is not a member of 'Ipopt::TNLP'
> 1>        c:\optdir\iptnlp.hpp(48) : see declaration of 'Ipopt::TNLP'
>
>
>
> But this is not right, and these members are present in the derived class.
> I declare the smart pointer thus:
>
>     SmartPtr<TNLP> p_optdata;
> and instantiate it as p_optdata = new COpt() where COpt is the derived class
> from TNLP.
>
> Is there some other way I should treat this derived class?  If any more
> information is needed, please let me know?
>
> I even tried SmarPtr<COpt> p_optdata.  The compiler does not like this.  The
> complaints about the new data members are gone. but instead I get
>
> 1>c:\documents and settings\kris\my
> documents\projects\bmopt\bmopt\bmoptdoc.cpp(105) : error C2664:
> 'Ipopt::IpoptApplication::OptimizeTNLP' : cannot convert parameter 1 from
> 'Ipopt::SmartPtr<T>' to 'const Ipopt::SmartPtr<T> &'
> 1>        with
> 1>        [
> 1>            T=COpt
> 1>        ]
> 1>        and
> 1>        [
> 1>            T=Ipopt::TNLP
> 1>        ]
> 1>        Reason: cannot convert from 'Ipopt::SmartPtr<T>' to 'const
> Ipopt::SmartPtr<T>'
> 1>        with
> 1>        [
> 1>            T=COpt
> 1>        ]
> 1>        and
> 1>        [
> 1>            T=Ipopt::TNLP
> 1>        ]
> 1>        No user-defined-conversion operator available that can perform
> this conversion, or the operator cannot be called
>
> I guess this is because oc the const declaration.
>
>
> Any way I can solve this issue?  This is the very last part of my
> implementation, and any help would be appreciated.
>
> Thanks in advance
>
> Krish
>
>
>
> _______________________________________________
> Ipopt mailing list
> Ipopt at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/ipopt
>
>



-- 

Carl D. Laird
Assistant Professor,
Artie McFerrin Department of Chemical Engineering,
Texas A&M University
Ph: (979) 458-4514
Email: carl.laird at tamu.edu


More information about the Ipopt mailing list