sınıf içinden aynı sınıf içindeki değişkeme değer atama

C, C++ ve C++ Builder ile ilgili konuları buraya yazabilirsiniz.
Cevapla
theSinan

sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen theSinan »

s.a

form3.h da böyle bir sınıf yazıyorum

Kod: Tümünü seç

class Islemler
	{
	protected:
	private:
	public:
                 int intdegiskenSayi;
	void Kontrol();
                }
form3.cpp dem de işlemler sınıfımdaki intdegiskenSayi değişkenime değer atamam gerekiyor
yani

Kod: Tümünü seç

void Islemler::Kontrol()
              {
              this->intdegiskenSayi=25; //ulaşamıyorum
              Islemler::intdegiskenSayi=25 // yazıyorum ulaşamıyorum
             intdegiskenSayi=25// yazıyorum ulaşamıyor
             }


Islemler *islem

islem->Kontrol();
bu örnek sınıf yazımı bu şekilde kodlar uzun olduğundan ben ornek yazdım
neden ulaşamıyorum nasıl yazmam gerekiyor
derlemekte sorun yapmıyor
ancak fonksiyonu çağırında acces violation hatası veriyor
kontrol ediyorum
değere atadığım satırı gösteriyor
işim içinden çıkamadım

ekran görüntüsünü ekleyeme
çalışıtım
Seçtiğiniz resim en az 0 px genişliğinde, 0 px yüksekliğinde ve en fazla 100 px genişliğinde, 100 px yüksekliğinde olabilir. Seçtiğiniz resim 485 px genişliğinde ve 160 px yüksekliğindedir
100 px değerinde resim nasıl okunabilir ki
En son theSinan tarafından 20 Ara 2014 12:22 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen warder »

Kod: Tümünü seç

class Islemler
{
protected:
private:
public:
int intdegiskenSayi;
void Kontrol();
~Islemler() { } // yıkıcı
Islemler() { intdegiskenSayi = 0; }  // parametresiz kurucu
Islemler(int iSayi) { intdegiskenSayi = iSayi; }  // Kurucu aşırı yüklendi.. yaratılırken değer verilebilir... 
}
void Islemler::Kontrol()
{
this->intdegiskenSayi=25; //ulaşır.... this zaten otomatik vardır. yazmaya gerek yok.
Islemler::intdegiskenSayi=25 // ulaşır.... kapsama 3 satır yyukarda belirtildi gerek yok
intdegiskenSayi=25// ulaşır
}
Form3 içinde değilse ayrı bir dosyada sınıfı yoluşturup include etmenizi öneririm.
her sınıf kendi dosyasında mutludur... programcısıda..

Form3 içinde istenilen yerde kullanılabilir..

Kod: Tümünü seç

Islemler *islem1 = new Islemler();
Islemler * islem2 = new Islemler(25);
islem1->intdegiskenSayi = 25;
//....
delete islem1, islem2;
Global olacaksa header içerisinde tanımlayıp OnCreate de ilklendirip (new) kullanılabilir.

Kod: Tümünü seç

//...*.h
Islemler *islem1;
//-----------------
//....*.cpp
//Form::OnCreate() veya... Form::Form() içinde
islem1 = new Islemler(); // delete kullanılmaz.. Formun yıkıcısı o işi yapıyor..
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
theSinan

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen theSinan »

AMA BEN DAHA SINIFI TAMAMLADIM
yani yukarıda yazdığım örnek bir sınıf
form3.h da sınıfı oluşturuyorum
form3.cpp de

Kod: Tümünü seç

void Islemler::Kontrol()
fonksiyonun yapacağı işlemleri burada yazıyorum (yani içeriğini dolduruyorum)
bu şekilde yazmam gerekiyor
bu sadece örneği çünkü fonksiyonda başka işlemlerde yapılıyor
okunabilirlik olsun diye onları yazmadım

Kod: Tümünü seç

void Islemler::Kontrol()
 {
 this->intdegiskenSayi=25; //ulaşamıyorum
 Islemler::intdegiskenSayi=25 // yazıyorum ulaşamıyorum
 intdegiskenSayi=25// yazıyorum ulaşamıyor
 }
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen warder »

Her durumda yazdıklarım geçerli.
işaretçi kullanımını kaldırıp nokta operatörü ile de erişim sağlayabilirsiniz.
İşaretçi kullanımını daha ileride değerlendirebilirsiniz.
Bu durumda problem yaşamazsınız.

Kod: Tümünü seç

//Islemler *islem
//islem->Kontrol();
Islemler islem;
islem.Kontrol();
Caption = String(islem.intdegiskenSayi); 
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
theSinan

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen theSinan »

Hocam allah razı olsun yarın denicem inşallah yardım ların için çok teşekkür ederim
theSinan

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen theSinan »

işin içinden Çıkamadım
kusura bakmayın Tekrar Yazıyorum
Ben Bu Global Sınıf olayını Çözemedim
şimdi Baştan Yazayım Cahilliğime verin

şimdi bir proje açtım
Global Sınıf Global Değişken (yani bir formdan diğer formda oluşturduğum sınıfın değişkenine bir değer atıyorum
sonra o formu kapatıyorum
deger atağıdım değişkeni çağırdığımda atadığım degerinde kapattığım formla birlikte yok olduğunu görüyorum işten ben burayı çözemedim)

mantığını ögrenmek için bir proje açtım
iki tane Form oluşturdum
biri ana form yani yani bu Formun headırından bir global değişkenleri tutmak için bir sınıf oluşturdum
formun Headerı
şöyle

Kod: Tümünü seç


//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TButton *Button1;
	TButton *Button2;
	void __fastcall Button2Click(TObject *Sender);
	void __fastcall Button1Click(TObject *Sender);
private:	// User declarations
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
};

class GlobalSinif
		{
		  public:
		  String strGlobalDegisken1;

		  String DegiskenAL()
		  {
		   return strGlobalDegisken1;
		  }
		  void strGlobalDegiskenAta(String strDegisken)
		  {
		   strGlobalDegisken1= strDegisken ;
		  }

		} ;


//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

bu boş bir forum headırına
ben sadece

Kod: Tümünü seç

class GlobalSinif
		{
		  public:
		  String strGlobalDegisken1;

		  String DegiskenAL()
		  {
		   return strGlobalDegisken1;
		  }
		  void strGlobalDegiskenAta(String strDegisken)
		  {
		   strGlobalDegisken1= strDegisken ;
		  }

		} ;
bu sınıfı headera yazdım
bu form hiç kapanmaz yani ana form diyelim
hiç kapanmadığı içinde bu sınıfın değişkenlerine yazılan değerlerinde silinmemesi gerekiyor değilmi

Form1 iki tanede button ekledim
bir button ile form2 açacağım
ikinci button ile GlobalSinif daki strGlobalDegisken1 degerini ShowMessageBox içinde Göstermek için Kullanacağım
Form2 açmak için
ve GlobalSinifi Kullanabilmek için

Kod: Tümünü seç

#include "Unit2.h"
GlobalSinif *GlobalSinifimiz = new GlobalSinif;
Form2 unit.h include ettim
Button1 Onclick olayına

Kod: Tümünü seç

	
Application->CreateForm(__classid(TForm2), &Form2);
Form2->Show();

Button1 onclick olayına ise

Kod: Tümünü seç

ShowMessage(GlobalSinifimiz->DegiskenAL())	 ;

geldik ikinci forma
boş formu açtım
bir edit
2 adet button koydum
bu formdan ana formda oluşturduğum global sınıfa erişmek için

Kod: Tümünü seç

#include "Unit1.h"
GlobalSinif *GlobalSinifimiz = new GlobalSinif;
form1 unit.h include ettim
button1 onclick olayına

Kod: Tümünü seç

GlobalSinifimiz->strGlobalDegiskenAta(Edit1->Text);
ShowMessage(Edit1->Text+" Global strGlobalDegisken1 Değişkenine Atandı");
GlobalSinifimiz->strGlobalDegiskenAta fonksiyonu ile
GlobalDegiskenler sınıfınfaki strGlobalDegisken1'e Edit1 deki Değeri Atadım


GlobalSinifimiz->strGlobalDegiskenAta fonksiyonu ile strGlobalDegisken1 degere atayıp atamadığımı kontrol etmek için
button2 onclick olayına

Kod: Tümünü seç

ShowMessage(GlobalSinifimiz->DegiskenAL())	 ;
Projemi Çalıştırdım
Form1 (yani ana form geldi)
Form1 deki button1 bastım
Form2 açıldı
Form2 deki editde bişeyler yazıp button1 tıkladım

Kod: Tümünü seç

GlobalSinifimiz->strGlobalDegiskenAta(Edit1->Text);
ShowMessage(Edit1->Text+" Global strGlobalDegisken1 Değişkenine Atandı");
kod sorunsuzca çalıştı
test için button2 tıkladım

Kod: Tümünü seç

ShowMessage(GlobalSinifimiz->DegiskenAL())	 ;
bu kod da sorunsuzca çalıştı
Edit yazdığım degerleri mesaj Penceresi içinde Çıktı



Buraya Kadar Herşey Normal

şimdi Form1 deki Button2 bastığımda ise ShowMessage Penceresi Boş Geldi
Tam bir hayal kırıklığı
yani
Form2 nin edit1 yazdığım değeri görmem gerekirken boş geldi
oysa
ben Form2 den
button1 onclick olayında

Kod: Tümünü seç

GlobalSinifimiz->strGlobalDegiskenAta(Edit1->Text);
Edit1.textine yazdığım degeri
GlobalSinifimiz->strGlobalDegiskenAta
fonksiyonu ile
GlobalSinifimiz sınıfındaki strGlobalDegisken1 atamıştım
ama neden Form2 den
Form1 deki GlobalSınıfa Attığım degeri
Form1 den Göremiyorum bir türlü anlamadım
neden Boş Geliyor

çıkamadım işin içinden
nasıl yapmam gerekiyor
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen warder »

Yeni bir dosyada, kendi dosyasında tanımlamamakta ısrar ettiğiniz class...
Çok uzun bir anlatım olmuş. Projenizi ekleyebilirseniz daha anlaşılır olacak sanıyorum.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
theSinan

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen theSinan »

Haklısınız hocam çok uzun oldu
kısacası ben bir sınıf oluşturmak istiyorum
içinde de global değişkenler olacak
projemdeki bütün formlardan sınıf içindeki değişkenlere deger atayıp
yine projemdeki formlardan istediğim formda değişkene atadığım degeri okumak istiyorum
bunu yapamadım
hangi formdan değişkene deger atıyorsam sadece o formdan atadığım degeri okuyabiliyorum
diğer formdan okumaya çalışınca boş oluyor
bunu çözemedim
örnek çalışmamı ekte atacladım
global değişken dediğimiz zaman
sadece o formdaki bütün nesnelerden ulaşılan değişken mi demektir
yardımlarınız için allah razı olsun
Dosya ekleri
globalDegisken.rar
(47.65 KiB) 143 kere indirildi
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen SimaWB »

singleton pattern'i araştırmanızı tavsiye ederim.
GlobalSinif.h adında bir dosya oluşturup aşağıdaki şekilde doldurun. Daha sonra bu sınıfı nerede kullanmak isterseniz o dosyaya GlobalSinif.h'ı include edersiniz. Ve o dosya içinde tekrar GlobalSınıf tanımlamadan GlobalSinifInstance değişkenini kullanabilirsiniz:

Kod: Tümünü seç

class GlobalSinif
{
  public:
  String strGlobalDegisken1;
  String DegiskenAL();  
  void strGlobalDegiskenAta(String strDegisken);
};

extern GlobalSinif GlobalSinifInstance;

GlobalSinif GlobalSinifInstance;

GlobalSinif::DegiskenAL()
{
  return strGlobalDegisken1;
}

void GlobalSinif::strGlobalDegiskenAta(String strDegisken)
{
  strGlobalDegisken1= strDegisken ;
}
Not: Kodları test etmeden yazıyorum, hata olabilir...
There's no place like 127.0.0.1
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen warder »

Ortamım uygun değil... ekteki dosyanızı henüz inceleyemedim...
Ancak...
kısacası ben bir sınıf oluşturmak istiyorum
Kendi *.h ve *.cpp dosyasında oluşturun. daha kullanışlı olur.
içinde de global değişkenler olacak
public: altında tanımlayın.
projemdeki bütün formlardan sınıf içindeki değişkenlere deger atayıp
yine projemdeki formlardan istediğim formda değişkene atadığım degeri okumak istiyorum
Sınıfınızı tanımladığınız *.h dosyasını (sinif1.h olsun) global olmasını istediğiniz formun *.h dosyasına (form.h olsun) include edin.
form.h dosyasının public: altına değişken olarak tanımlayın

Kod: Tümünü seç

#include "sinif1.h"
.....
public :
   sinifim * sinif;
....
form.cpp dosyasında formun create işleminde ram bölgesinden sınıfınıza yer ayırttırın.

Kod: Tümünü seç

 form::form
...
   sinif = new sinifim; 
// bu formun istediğin yerinde erişebilirsiniz.
    sinif->değer = 25;
Başka formlardan veya dosyalardan erişmek istediğinize.. global kullanmak istediğinizde...
form.h dosyasını kullanmak istediğiniz yere include edin. Çünkü tanımlamaları, ilk değerleri vs. form.h ve form.cpp de yaptık..
Kullanmak istediğimiz yer form2 olsun..

Kod: Tümünü seç

// form2.h veya form2.cpp altında
#include "form.h"
// form2.cpp de istediğimiz yerden erişiyoruz..
int değer;
değer = form->sinif->değer; //yukarda int olduğunu varsayıp değer vermiştik...
int baskadeger = form->sinif->değer;
Hepsi bu kadar...
global değişken dediğimiz zaman
sadece o formdaki bütün nesnelerden ulaşılan değişken mi demektir
global değişkenin tanımlandığı unit'i nerede include ederseniz oradan erişirsiniz.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen warder »

Ekte gönderdiğiniz dosyayı sizin kodlarınız üzerinden düzenleyip mesaja ekledim.
Dosyalara açıklama satırları da ekledim.
Dosyada olanlar yukarıda mesajlarımda anlattıklarımdan ibarettir.
Kolay gelsin.
Dosya ekleri
globalDegisken.7z
Dosyanızın düzenlenmiş hali..
(45.51 KiB) 152 kere indirildi
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
theSinan

Re: sınıf içinden aynı sınıf içindeki değişkeme değer atama

Mesaj gönderen theSinan »

Hocam Allah Razı olsun Tam istediğim Gibi Oldu
Ne Kadar Teşekkür Etsem Azdır
Allahım Dünya Ahiret İşlerini Kolay Etsin
Cevapla