Thread overview
Miras alma olayları ve kurucular (yabancı forumda alevlendi)
March 23

Merhaba,

Sonunda dişime göre öğrenebileceğim bir tartışma yabancı forumda alevlendi. Kırklı yaşlarıma geldim, hala şu nesneye dayalı programlamaya dair soru işaretleri bitmiyor. Son tartışma (1 gün önceki) güzel, kesinlike tavsiye edeceğim cinsten. Hatta out öznitelği ile alakalı başlıktan sonra mutlaka bakılmalı diye düşünüyorum, işte:

https://forum.dlang.org/thread/pvwltfoetuncbpuuudcd@forum.dlang.org

Bu sadece bir duyuru olmayacak! Belki herkesin ortak ve her gün kodladığı şeylere bir nebze değineceğiz. Hatta herkes kesesine bir şey biriktirip gidebilir şu mübarek günlerde; bayrama yaklaştığımız!

Sorudaki (Andy'nin paylaştığı) örneği cevabıyla birlikte biraz değiştirdim:

class C : SC
{
    string msg;

    this(string str)
    {
        this(); //Ali ekledi
        msg = str;
    }

    // monkyyy ekledi
    this(A...)(A args)
    {
        super(args);
    }
}

alias SC = StaticCounter;
class StaticCounter
{
    static int id;
    this() { ++id; }
}

void main()
{
    auto b1 = new C();
    b1.id.writeln(": ", b1.msg);

    auto b2 = new C("Hi, Mom!");
    b2.id.writeln(": ", b2.msg);
}

Yukardaki kod temelde orijinal örnekle aynı ve çıktısı b1 ve b2'yi sayacak şekilde düzenlendi. Bunun için statik bir sayaç kullandım ama dikkat sınıf statik değil sadece üyesi (int id) öyle. Bir de farklı olan super() ile beraber ekstradan this() kurucunun çağrılmış olması...

Aslında yukardaki kodda biri Ali hocadan olan 2 cevap gizli. Diğer arkadaş argüman parametresi alması gerektiği şekilde cevaplarken Ali hocanın sezgisi super keyword'ü yerine this kullanıması yönünde. İşin ilginci kodu her iki şekilde de derliyorsunuz.

Neyse, asıl irdelemek istediğim diğer mesajdı çünkü bu çok simple yapıyı nested haline sokabilir miyim diye düşündüm ve iç içe yeni bir sınıfımız daha oldu, soru orda, diğer mesajda yer alacak :)

SDB@79

March 23

On Sunday, 23 March 2025 at 14:38:45 UTC, Salih Dincer wrote:

>

soru orda, diğer mesajda yer alacak :)

Cevabı basit bir sorum var sanırım; b1 durumu ile alakalı. Önceki örneğe benziyor sadece NSC'yi ekledim ve içteki sınıfın üstündeki id'ye erişebildiğini gördüm:

class C : SC
{
    string msg;
    NSC cnt; // Salih ekledi

    this(string str)
    {
        super();
        msg = str;
        cnt = new NSC(); // Salih ekledi
    }

    this(A...)(A args)
    {
        super(args);
    }

    // Salih ekledi:
    alias NSC = NonStaticCounter;
    class NonStaticCounter
    {
        int num;
        this() { num = id; }
    }
}

alias SC = StaticCounter;
class StaticCounter
{
    static int id;
    this() { ++id; }
}

import std.stdio : writeln;
void main()
{
    auto b1 = new C();
    b1.id.writeln(": ", b1.msg);
    //b1.cnt.num.writeln; // Segmentation fault

    auto b2 = new C("Hi, Mom!");
    b2.id.writeln(": ", b2.msg);
    b2.cnt.num.writeln;
}

Eğer sayaçı (C sınıfı) dizge olmadan kurarsak doğal olarak cnt null kalıyor. Peki bu durumu çözebilmenin bir yolu var mı? Yani en azından 0 olsun :)

Gerçi dolaylı çözüm belki NSC içindeki num'u private yapıp dışarıya (modüller arası dünyaya) kapayabilirim. Böylece ona erişebilmek için bir işlev üye kullanaiblirim. O da null olup olmadığna bakar değil mi?

Örneğin:

    auto getCount() => cnt is null ? 0 : cnt.num;

Teşekkürler...

SDB@79

March 23
On 3/23/25 7:58 AM, Salih Dincer wrote:

>      this(string str)
>      {
>          super();
>          msg = str;
>          cnt = new NSC(); // Salih ekledi
>      }

Tamam, cnt'yi yalnızca 'string' ile kurulurken ilkliyorsun.

> Eğer sayaçı (C sınıfı) dizge olmadan kurarsak doğal olarak `cnt null`
> kalıyor. Peki bu durumu çözebilmenin bir yolu var mı? Yani en azından 0
> olsun :)

Diğer kurucularda da ilklesen?

Ali

March 24

On Sunday, 23 March 2025 at 20:11:46 UTC, Ali Çehreli wrote:

>

Diğer kurucularda da ilklesen?

Bunu hiç düşünmemiştim! Hatta A... kullanmadım ve sadece string kurucusundan çıkarıken `this()``i çağırdım o kadar:

class C : SC
{
    string msg;
    NSC cnt;

    this()
    {
        cnt = new NSC();
    }

    this(string msg)
    {
        this.msg = msg;
        this();
    }

    class NSC // NonStaticCounter
    {
        int num;
        this() { num = id; }
    }
}

class SC // StaticCounter
{
    static int id;
    this() { ++id; }
}

import std.stdio : writeln;
void main()
{
    with ( new C() )
    {
        id.writeln(": ", msg);
        cnt.num.writeln;
    }

    with ( new C("Hi, Mom!") )
    {
        id.writeln(": ", msg);
        cnt.num.writeln;
    }
}

SDB@79