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

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

Primearc

Hectopat
Katılım
3 Ocak 2021
Mesajlar
1.489
Makaleler
3
Çözümler
13
Yer
Matrix
Ö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..

[CODE lang="cpp" title="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;
}[/CODE]
 
Çö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.
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
 
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ı.
 
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.
 
Çevrimi çok basit, bence deneyebilirsin. Yine sorun yaşarsan müsait bir zamanımda döneyim sana.
[CODE lang="cpp" title="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;
}[/CODE]

Çevirimi şu şekilde oluyor.
Çevrimi çok basit, bence deneyebilirsin. Yine sorun yaşarsan müsait bir zamanımda döneyim sana.
[CODE lang="cpp" title="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;
}[/CODE]

Ç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
 
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
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.

[CODE title="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;
}[/CODE]
[CODE title="Gamer.h"]#pragma once
#include <iostream>

class Gamer{
public:
static int gamers;

Gamer();
};[/CODE]
[CODE title="Gamer.cpp"]#include "Gamer.h"

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

int Gamer::gamers = 0;
[/CODE]
 

Yeni konular

Geri
Yukarı