• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmienna globalna pobranie jej do metody klasy

+1 głos
639 wizyt
pytanie zadane 5 października 2021 w C i C++ przez Eniggme Nowicjusz (230 p.)

Witam,

Jestem dość nowym w świecie programowania, swoją przygodę rozpocząłem od kursu P. Mirosław-a. Chcą szlifować swoje umiejętności postanowiłem więc napisać swój własny program, w którym wykorzystywałbym wszystko co do tej pory na kursie było omawiane (obecnie jestem na obiektowy c++ odc.4).

Problem dotyczy obiektów, a mianowicie w programie głównym stworzyłem zmienną globalną, którą chciałbym wykorzystywać w klasie z tym, że nie potrafię jej pobrać. Zdaje sobie sprawę z banalności tego problemu dla doświadczonego programisty być może coś podobnego zostało w filmie omówione ale nie mogę się tego doszukać. W internecie nie mogę znaleźć nic konkretnego prócz wzmianki o skorzystaniu z jakiegoś operatora, który określił by zakres zmiennej np ::k lub .k próbowałem bez rezultatów. 

 

 

2 odpowiedzi

0 głosów
odpowiedź 5 października 2021 przez tangarr Mędrzec (155,140 p.)
#include <iostream>

int zmiennaGlobalna = 3;

class Klasa {
public:
    int funkcja() {
        return zmiennaGlobalna;
    }
}

int main() {
    Klasa k;
    std::cout << k.funkcja();
}

Jeżeli zmienna globalna znajduje się w innym pliku cpp to wystarczy, żebyś "poinformował" linker o istnieniu takiej zmiennej

extern int zmiennaGlobalna;

class Klasa {
public:
    int funkcja() {
        return zmiennaGlobalna;
    }
}

 

0 głosów
odpowiedź 5 października 2021 przez TOM_CPP Pasjonat (22,640 p.)

w programie głównym stworzyłem zmienną globalną, którą chciałbym wykorzystywać w klasie

Nie powinieneś używać w swoim programie zmiennych globalnych, jest to złą praktyką, która wcześniej czy później będzie źródłem różnego rodzaju problemów zobacz [ang]. Najlepiej nauczyć się tego na początku nauki programowania.

Jeżeli chcesz użyć zmiennej w klasie, to po prostu zdefiniuj ją wewnątrz niej - dodaj ją jako zmienną składową. Wtedy będziesz miał do niej już bezpośredni dostęp.

 

komentarz 5 października 2021 przez Eniggme Nowicjusz (230 p.)

Dziękuje Wam za szybko odpowiedź i za cenna wskazówkę postaram się do niej zastosować. 

Skoro korzystanie ze zmiennych globalnych przez klasę jest złą praktyką zastanawiam się jak rozgryźć mój problem. Chciałem stworzyć prostą grę w konsoli gdzie main program zawiera menu i switcha z przypisanymi funkcjami menu. Wybranie jednej z opcji menu rozpocznie budowanie i po upływie czasu pogram przyzna punkt, inna funkcjonalność to przyznanie punktu w zależności od minionego czasu, a wynik zostanie zapisany do pliku tekstowego. itp.

Prościej będzie jak przedstawię to w formie kodu :

 

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include "logowanie.h"

using namespace std;

char wybor;
int czas;


void budwanie(int b)
{
    cout << "Rozpoczynam budowanie " << endl;

    for (int i=b; i>=0; i--)
    {
        Sleep(1000);
        cout <<"Pozostalo " << i << " sekund do konca budowy." << endl;
    }

    cout << "Wybudowales DOM"<< endl;
}


int main()
{
   Logowanie w1;
   w1.logo();
   w1.pw();

for(;;)
{
    cout << "Witaj w prostej grze o budowaniu" << endl;
    cout << "--------------------------------" << endl;
    cout << "Podaj numer budynku do budowy : " << endl;
    cout << "1. DOM : " << endl;
    cout << "2. Wiezowiec : " << endl;
    cout << "3. Palac : " << endl;
    cout << "4. Wyswietl liczbe ptk : " << endl;
    cout << "5. Exit " << endl;

    wybor=getch();

        switch (wybor)
        {

        case '1':
            {
                czas=10;
                cout << "Wybrales DOM czas budowy : " << czas << endl;
                budwanie(czas);
                w1.liczenie();

            }
        break;

        case '2':
            {
                czas=20;
                cout << "Wybrales Wiezowiec czas budowy : " << czas << endl;
                budwanie(czas);

            }
        break;

        case '3':
            {
                czas=30;
                cout << "Wybrales Palac czas budowy : " << czas << endl;
                budwanie(czas);

            }

        case '4':
            {
                system("cls");
                cout << "Zebrane punkty " << endl;
                w1.zapis();
                Sleep(1000);
            }
        break;

        case '5':
            {
                exit(0);
            }
        break;

        default: cout << "Nie ma takiej opcji" << endl;
        }
}
    return 0;
}
#include <iostream>

using namespace std;

class Logowanie
{
private:

    string login;
    string password;
    int punkty;
    int k;


public:

    void logo();
    void pw();
    void zapis();
    void liczenie();
};
#include <iostream>
#include <windows.h>
#include "logowanie.h"

using namespace std;


    void Logowanie::logo()
    {
    for (int i=0; i<=5;i++)
    {
        cout << "Podaj login : ";
        cin >> login;

    if (login=="zxc") break;

    else
    {
        cout << "Nie zalogowales sie" << endl;
        Sleep(1000);
        system("cls");
    }
    if (i==4)
    {
        cout << "Wykorzystales limit prob";
        Sleep(2000);
        exit(0);
    }
    }
    }

    void Logowanie::pw()
    {
    for (int i=0; i<=5;i++)
    {
        cout << "Podaj haslo : ";
        cin >> password;

    if (password=="123")
    {
           cout << "Zalogowaleœ sie" << endl;
           system("cls");
           break;
    }
    else
    {
        cout << "Nie zalogowales sie" << endl;
        Sleep(1000);
        system("cls");
    }
    if (i==4)
    {
        cout << "Wykorzystales limit prob";
        Sleep(2000);
        exit(0);
    }
    }
    }
#include <iostream>
#include <fstream>
#include "logowanie.h"
#include <windows.h>

using namespace std;

void Logowanie::zapis()
{


    fstream plik;

    plik.open("punkty.txt", ios::out | ios::app);

    plik << punkty;

    plik.close();

    cout << punkty << endl;
}

void Logowanie::liczenie()
{
    if (k>=10)
    {
        punkty=punkty+1;
        cout << "Zdobyles punkty";
        Sleep(2000);
    }
    else if (k>=20)
    {
        punkty=punkty+3;
    }
    else if (k>=30)
    {
        punkty=punkty+3;
    }
    else
    {
        cout << "brak punktow ";
        Sleep(2000);
        system("cls");
    }
}


Nie wiem jak zrobić a by void liczenie z klasy logowanie pobierał czas z programu głównego porównywał go i wzależnosci od czasy przyznawał odpowiednią ilość punktów.

Podobne pytania

0 głosów
1 odpowiedź 1,381 wizyt
pytanie zadane 25 kwietnia 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
1 odpowiedź 415 wizyt
0 głosów
1 odpowiedź 550 wizyt

93,753 zapytań

142,713 odpowiedzi

323,356 komentarzy

63,348 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...