C++ this nedir ne işe yarar | C++ this keyword kullanımı

 this keyword -anahtar kelimesi, aynen ingilizcede olduğu gibi bu anlamına gelir ve mevcut nesne instance 'ını işaret eder, işaret eder ibaresinden, arkadaşın bir pointer olduğunu anlayabiliriz. Pointer konusunu ileride yazıyor oluruz, çok kafaya takılacak bir durumu yoktur, kendisi de bir değişken olup işaret ettiği değişken ya da nesnenin bellek adresini tutar sadece. Ne diyorum, nedir "nesne" nin instance 'ı, bunu bilmek ne işimize yarayacak ya da nasıl kullanacağız bakalım.

Bir class 'ım var, sistemimdeki motoru sürdüğüm ve ona bağlı değişkenleri parametreleri fonksiyonları/işlevleri barındırdığım. Motora sistemin bir çok modülünden erişmem ve yönetmem ya da parametrelerini okuyup değiştirmem gerekiyor. Bu class 'ımı da bir cpp dosyasında barındırıyorum, bir de header dosyam var. 

Header dosyam şu şekilde olsun:

#ifndef _ENGINE_H_
#define _ENGINE_H_
#include "enums.h"

class DCEngine
{
public:
    DCEngine();
    void Start(DirectionOfRotation Rotation, engineTurnFor TurnFor);
    bool checkIsSafe();
    void Stop();
    void setSpeed(uint8_t pwmVal);
    void setMotor(DirectionOfRotation dir, uint8_t power);
    void EmergencySTOP();

public:
    EngineState State = (EngineState)STOP;
    DirectionOfRotation direction = CW;
    uint8_t pwmVal = 40;
    RCFilter filtRpmA, filtRpmB;
    volatile double rpmA, rpmB, rpmZ = 0;
    volatile double rpmAfiltered, rpmBfiltered = 0;
};
#endif

header dosyamızda fonksiyon prototiplerimiz ve değişkenlerimiz var. Cpp dosyamız da şu şekilde


#include "engine.h"

DCEngine Engine;
DCEngine *enginePtr;

DCEngine::DCEngine()
{
    enginePtr = this;
}
bool DCEngine::checkIsSafe()
{
    /* Check If any problem with Running the engine */
}
void DCEngine::Start(DirectionOfRotation Rotation, engineTurnFor TurnFor)
{
}
void DCEngine::setSpeed(uint8_t pwmVal)
{
}
void DCEngine::setMotor(DirectionOfRotation dir, uint8_t power)
{

}
void DCEngine::Stop()
{
    /* setup engine driver to stop condition */
}

Buradaki asıl olayımız motoru sürmek olmadığından fonksiyonları boş bıraktım. Konu itibariyle dikkat etmeniz gereken yerlere bakalım : cpp dosyasındaki 

DCEngine Engine;
DCEngine *enginePtr;

ilk satır DCEngine class 'ına ait bir instance oluşturur, ikinci satır tipi DCEngine nesnesi olan bir pointer oluşturur ancak henüz işaret ettiği bir instance yoktur bu pointer için. Class 'ın constructor 'ı dediğimiz ve class ile aynı ismi taşıyan fonksiyon, class instance 'ını oluşturuğumuz anda çalışan kod parçasıdır, yani yukardaki ilk satır işleme alındığında bu kod bloğu yürütülür :

DCEngine::DCEngine()
{
    enginePtr = this;
    RCFilter_Init(&filtRpmB, 10.0f, 0.00065f);
}

instance oluşturulduğunda, evvelce oluşturduğumuz class pointer 'ının (enginePtr) içi dolmuş ve en son oluşturulan DCEngine class 'ının instance ına ait bellek adresini taşımaya başlar. Tam değişiyle Engine nesnesini işaret eder / gösterir / erişim hakkı tanır.

Artık diğer herhangi bir cpp dosyasının içerisinden 

extern DCEngine *enginePtr;

yazarak sayfanın herhangi bir yerinden bu DCEngine Instance 'ına şu şekilde ulaşabiliyor olacağız

enginePtr->Start();
enginePtr->pwmVal = 45;

peki neden bu yolu izliyoruz? Lazım olan sayfada bu instance 'ı oluşturup pekala erişebilirim, evet erişebilirsin ancak amacımız tek bir instance 'a sahip olmak ve heryerden aynı instance 'a erişmek. Diğer türlü her instance için ayrı bir bellek ayırmış olursun ve her instance 'ın parametreleri birbirinden farklı olabilir, bir diğer önemli olan noktaysa bu şekilde bir nesne instance'ına static bir fonksiyonun içinden de erişebiliyor olman olacaktır. Son olarak neden oluşturulan son instance 'ı işaret eder dediğime dikkat edin, eğer başka bi yerde başka bir instance oluşturursanız enginePtr artık oluşturduğunuz son instance ' ı işaret ediyor olacak.

Bir örnek daha verelim de olay biraz daha netleşsin mi?

class deneme
{
private:
    int x = 0;

public:
    void setX(int x)
    {
        this->x = x;
    }
};

class 'ıma ait bit x var, class 'ıma ait bir fonksiyonun parametresi olarak da x var, Fonksiyona parametre olarak gönderilen x değerini class 'ıma ait x değerine ataması için bir fonksiyon yazmışım, fantastik mi görünüyor? neden ikisi de x birinin adını değiştirip çözerim ben bu işi, tabii ki öyle ama her zaman kod yazmazsınız, bazen başkasının yazdığı kodu anlamanız gerekir ve o da böyle yazmıştır kodu :) aslında bu yapı c# daki bir class property 'sinin get set edilmesinin temelidir. Koddan anlaşılacağı üzere class 'a ait x değişkenine this ile erişiriz. this->x class 'ın x idir, yalın x parametreden gelen x 'tir.


Önceki Konu : C++ Literals

İçerik : C++ Dersleri Konu Başlıkları ~ İçerik

Sonraki Konu : C++ Integer Literal | Tam sayı hazır bilgileri

Yorumlar

Bu blogdaki popüler yayınlar

Arduino IDE Kod Satır Numaraları Nasıl Açılır

DMD2TUR | Arduino P10 Led Panel için Türkçe Karakter Desteği | Arduino P10 Led panel Türkçe yazı yazma

P10 Led Panel Nasıl Sürülür - Arduino kod