• 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

Object Storage Arubacloud
+1 głos
350 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 (154,780 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ź 460 wizyt
pytanie zadane 25 kwietnia 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
1 odpowiedź 150 wizyt
0 głosów
1 odpowiedź 323 wizyt

92,555 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,941 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...