Ola Skavhaug wrote:
> On Mon, Sep 7, 2009 at 9:21 AM, Ola Skavhaug<[email protected]> wrote:
>> We've run into problems since only GenericMatrix provides the default
>> argument for norm type. Swig does not like this and omits generating a
>> constructor for the derived types. According to
>> https://www.securecoding.cert.org/confluence/display/cplusplus/OBJ04-CPP.+Prefer+not+to+give+virtual+functions+default+argument+initializers
>> virtual function should not provide default arguments at it tends to
>> "defeat polymorphism":
>>
>>
>> class Thing {
>> public:
>> virtual ~Thing();
>> virtual void doItNTimes( int numTimes = 10 );
>> virtual void doItThisHigh( double howHigh = 1.0 );
>> // ...
>> };
>> class MyThing : public Thing {
>> public:
>> void doItNTimes( int numTimes );
>> void doItThisHigh( double howHigh = 2.2 );
>> // ...
>> };
>>
>> MyThing *mt = new MyThing;
>> Thing *t = mt;
>> t->doItNTimes(); // default of 10
>> mt->doItNTimes(); // compile time error!
>> t->doItThisHigh(); // default of 1.0!
>> mt->doItThisHigh(); // default of 2.2
>>
>>
>> Is this the intended behaviour anyhow?
>>
>> This is the proposed solution:
>
> Ouch, this was another, bad solution actually :)
>
> The proposed solution (from the link above) is roughly like this:
>
> class Base
> {
> public:
> void foo(double bar = 1.0) { foo_impl(bar); }
> protected:
> virtual void foo_impl(double bar);
> };
>
> class Sub: public Base
> {
> protected:
> virtual void foo_impl(double bar);
> };
>
>
This is pretty ugly and I know that I'll forget about it within a day or
two. I suggest abandoning default arguments for norms if that fixes the
problem. We have a default argument for str(..), but I think that
PyDOLFIN has its own mechanism for this.
Note that we have a related Blueprint,
https://blueprints.launchpad.net/dolfin/+spec/default-parameters-cpp
Garth
> Sorry about that...
>
> Ola
>
>> static double const minimumHeight = 1.0;
>> // ...
>> namespace XYZ {
>> class Thing {
>> public:
>> virtual ~Thing();
>> virtual void doItThisHigh( double howHigh = minimumHeight );
>> // ...
>> };
>> }
>> // ...
>> namespace XYZ {
>> static double const minimumHeight = 2.2;
>> class MyThing : public Thing {
>> public:
>> void doItThisHigh( double howHigh = minimumHeight );
>> // ...
>> };
>> }
>>
>>
>> Resolving this issue also means getting the Python interface back on track.
>>
>> Ola
>>
>>
>> --
>> Ola Skavhaug
>>
>
>
>
_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev