digitalmars.D - pImpl in D
- Satoshi (37/37) Apr 04 2017 Hi,
- Satoshi (11/11) Apr 04 2017 test/Foo.di(3,1): Error: class test.Foo.FooPrivate is forward
- Dejan Lekic (18/20) Apr 04 2017 Some parts of Phobos use it. Example:
Hi,
do someone have any experience with pImpl and inheritance in D?
I tried something like:
// FooPrivate.d
class FooPrivate {
int a;
}
// BarPrivate.d
import FooPivate;
class BarPrivate : FooPrivate {
string b;
}
// Foo.d
import FooPrivate;
class Foo {
protected FooPrivate m_private;
this() { m_private = new FooPrivate; }
}
// Bar.d
import Foo;
import FooPrivate;
import BarPrivate;
class Bar : Foo {
this() { m_private = new BarPrivate; }
}
And public interface
// Foo.di
class FooPrivate;
class Foo {
private FooPrivate m_private;
}
Bar.d looks like it imported Foo with forward referenced
FooPrivate and is unable to resolve it by importing FooPrivate.
Is this bug?
Do you know about any *less verbose* design pattern how I can
hide implementaion details from .di files?
Thanks!
Apr 04 2017
test/Foo.di(3,1): Error: class test.Foo.FooPrivate is forward referenced when looking for 'opAssign' forward reference in Foo.di test/Bar.d(14,25): Error: cannot implicitly convert expression (p) of type test.BarPrivate.BarPrivate to test.Foo.FooPrivate I'm unable to cast from BarPrivate to FooPrivate because it can't recognize Bar : Foo; inheritance from Foo.di (FooPrivate.d and BarPrivate.d is ignored). test/Foo.di(3,1): Error: class test.Foo.FooPrivate is forward referenced when looking for 'opCast' same as first
Apr 04 2017
On Tuesday, 4 April 2017 at 12:05:15 UTC, Satoshi wrote:Hi, do someone have any experience with pImpl and inheritance in D?Some parts of Phobos use it. Example: https://github.com/dlang/phobos/blob/master/std/stdio.d Have a look at the struct ByLine It has something like: struct ByLine(Char, Terminator) { private: import std.typecons : RefCounted, RefCountedAutoInitialize; /* Ref-counting stops the source range's Impl * from getting out of sync after the range is copied, e.g. * when accessing range.front, then using std.range.take, * then accessing range.front again. */ alias PImpl = RefCounted!(Impl, RefCountedAutoInitialize.no); PImpl impl;
Apr 04 2017









Satoshi <satoshi rikarin.org> 