Çözüldü C++ Hata -3

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Primearc

Picopat
Katılım
3 Ocak 2021
Mesajlar
683
Makaleler
2
Çözümler
6
Yer
San Junipero
Öncelikle @TerabyteForever 'ın önceki sorumda bana attığı mesaja tamamen katılıyorum. Kendim uğraşmam lazım. Ama emin olun ki her soruyu zaten buraya atmıyorum. Önce uğraşıyorum ve hatanın sebebini anlamaya çalışıyorum. Daha sonra hata kodunu internetten arıyorum. Her neyse..

C++:
#include <iostream>

using namespace std;

class Gamer
{
public:
    static int gamers;
    Gamer() {
        gamers ++;
        cout << "Yeni oyuncu oluşturuldu" << endl;
    }
};

int main()
{
    int Gamer::gamers = 0;
   
   
    Gamer gamer1();
    Gamer gamer2();
    Gamer gamer3();
    Gamer gamer4();
    Gamer gamer5();

    cout << "Oyuncu sayısı: " << Gamer::gamers << endl;


    return 0;
}
 
Çözüm
Peki sadece tek metodla yapmak mümkün değil mi?

C++:
int main()
{
    Gamer gamer1;
    Gamer gamer2;
    Gamer gamer3
    cout << gamers << endl;
    return 0;
}

Daha rahat gör diye uzun uzun yazmıştım. Tabii ki mümkün. Zaten nesne yaratılınca constructor'da gamer sayısını artırıyorsun. Tek metoda da gerek yok ki, static olarak tutuyorsun değişkeni onu yazdırabilirsin direkt.

Personvern

Centipat
Katılım
12 Haziran 2020
Mesajlar
1.097
Makaleler
1
Çözümler
11
Yer
İstanbul
C++:
#include <iostream>

using namespace std;
static int gamers=0;
class Gamer
{
public:
    Gamer() {
        gamers++; // metot ekleyecektim vazgeçtim
        cout << "New gamer!" << endl;
    }

   int getGamersCount(){
        return gamers;
    }
};
int main()
{

Gamer* gamer1 = new Gamer;
   int x = gamer1 -> getGamersCount();
   cout<< x <<endl;

   Gamer* gamer2 = new Gamer;
   x = gamer2 -> getGamersCount();
   cout<< x <<endl;

Gamer* gamer3 = new Gamer;
   x = gamer3 -> getGamersCount();
  cout<< x <<endl;

return 0;
}

Böyle bir şey yapmak istiyorsun sanırım. Static değişkenlerini metot sınıf (Vavien düzeltti) içinde tanımlamana gerek yok, get/set metotlarına aşina olman gerek. Nesneyi yaratıp kullanman pek iyi değil.


@Vavien. neden üzüldün hayırdır
 

Personvern

Centipat
Katılım
12 Haziran 2020
Mesajlar
1.097
Makaleler
1
Çözümler
11
Yer
İstanbul
Static değişkeni metot içinde değil, sınıf içinde tanımlamış, sınıfa ait. Orada hata yok. Sonra ne hikmetse pointer kullanma zevkiniz var. Konu sahibi öyle yapmamış/istememiş ki.
Keza aldığınız bellek konumlarını da vermiyorsunuz.

Genel tabiriyle anlaması için çalışan bir kod parçası paylaştım. Proda kod çıkmıyoruz. Sizin verdiğiniz cevap yetersiz, kodu çalıştıramaz çünkü.

Çevrimi çok zor olmamalı.
 
KS
Primearc

Primearc

Picopat
Katılım
3 Ocak 2021
Mesajlar
683
Makaleler
2
Çözümler
6
Yer
San Junipero
17. satırda değişkene değer vermiyorsun, değişken tanımlıyorsun. Sorun bu. int yazısını sil.
Öyle yapınca da çalışmıyor denemiştim zaten.
17. satırda değişkene değer vermiyorsun, değişken tanımlıyorsun. Sorun bu. int yazısını sil.
Öyle yapınca da çalışmıyor denemiştim zaten.
C++:
#include <iostream>

using namespace std;
static int gamers=0;
class Gamer
{
public:
    Gamer() {
        gamers++; // metot ekleyecektim vazgeçtim
        cout << "New gamer!" << endl;
    }

   int getGamersCount(){
        return gamers;
    }
};
int main()
{

Gamer* gamer1 = new Gamer;
   int x = gamer1 -> getGamersCount();
   cout<< x <<endl;

   Gamer* gamer2 = new Gamer;
   x = gamer2 -> getGamersCount();
   cout<< x <<endl;

Gamer* gamer3 = new Gamer;
   x = gamer3 -> getGamersCount();
  cout<< x <<endl;

return 0;
}

Böyle bir şey yapmak istiyorsun sanırım. Static değişkenlerini metot sınıf (Vavien düzeltti) içinde tanımlamana gerek yok, get/set metotlarına aşina olman gerek. Nesneyi yaratıp kullanman pek iyi değil.


@Vavien. neden üzüldün hayırdır
Bu da bir çözüm şekli. Programın çıktısı bununla aynı olmasını istiyorum ama bunu pointer kullanmadan yapmak istiyorum.
 
KS
Primearc

Primearc

Picopat
Katılım
3 Ocak 2021
Mesajlar
683
Makaleler
2
Çözümler
6
Yer
San Junipero
Çevrimi çok basit, bence deneyebilirsin. Yine sorun yaşarsan müsait bir zamanımda döneyim sana.
C++:
#include <iostream>

using namespace std;
static int gamers = 0;
class Gamer
{
public:
    Gamer() {
        gamers++; // metot ekleyecektim vazgeçtim
        cout << "New gamer!" << endl;
    }

    int getGamersCount() {
        return gamers;
    }
};
int main()
{

    Gamer gamer1;
    int x = gamer1.getGamersCount();
    cout << x << endl;

    Gamer gamer2;
    x = gamer2.getGamersCount();
    cout << x << endl;

    Gamer gamer3;
    x = gamer3.getGamersCount();
    cout << x << endl;

    return 0;
}

Çevirimi şu şekilde oluyor.
Çevrimi çok basit, bence deneyebilirsin. Yine sorun yaşarsan müsait bir zamanımda döneyim sana.
C++:
#include <iostream>

using namespace std;
static int gamers = 0;
class Gamer
{
public:
    Gamer() {
        gamers++; // metot ekleyecektim vazgeçtim
        cout << "New gamer!" << endl;
    }

    int getGamersCount() {
        return gamers;
    }
};
int main()
{

    Gamer gamer1;
    int x = gamer1.getGamersCount();
    cout << x << endl;

    Gamer gamer2;
    x = gamer2.getGamersCount();
    cout << x << endl;

    Gamer gamer3;
    x = gamer3.getGamersCount();
    cout << x << endl;

    return 0;
}

Çevirimi şu şekilde oluyor.
Peki sadece tek metodla yapmak mümkün değil mi? 17. satırda int i silsem aslında çalışacak gibi gelmişti ama neden çalışmadığını anlayamadım
 

Personvern

Centipat
Katılım
12 Haziran 2020
Mesajlar
1.097
Makaleler
1
Çözümler
11
Yer
İstanbul
Peki sadece tek metodla yapmak mümkün değil mi?

C++:
int main()
{
    Gamer gamer1;
    Gamer gamer2;
    Gamer gamer3
    cout << gamers << endl;
    return 0;
}

Daha rahat gör diye uzun uzun yazmıştım. Tabii ki mümkün. Zaten nesne yaratılınca constructor'da gamer sayısını artırıyorsun. Tek metoda da gerek yok ki, static olarak tutuyorsun değişkeni onu yazdırabilirsin direkt.
 
Çözüm

Vavien.

Terapat
Katılım
20 Aralık 2014
Mesajlar
10.040
Makaleler
6
Çözümler
205
Yer
İstanbul
Ben yanlış görmüşüm. Üstüne yanlış hatırlamışım.
Ben şöyle söyleyeyim, gerisi sizde olsun.

Bu dosyalarda bu kodlar varken bende çalışıyor. Tek dosyada linker hatası veriyor.

Source.cpp:
#include <iostream>
#include "Gamer.h"

using namespace std;

int main() {

    Gamer gamer1;
    Gamer gamer2;
    Gamer gamer3;
    Gamer gamer4;
    Gamer gamer5;

    cout << "oyuncu sayisi: " << Gamer::gamers << endl;

    return 0;
}
Gamer.h:
#pragma once
#include <iostream>

class Gamer{
public:
    static int gamers;

    Gamer();
};
Gamer.cpp:
#include "Gamer.h"

Gamer::Gamer(){
    gamers++;
    std::cout << "Yeni oyuncu olusturuldu." << std::endl;
}

int Gamer::gamers = 0;
 
Yukarı