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

Jak odczytać zmienną obiektu klasy w innym podgrogramie? "z' was not declared in this scope"

0 głosów
1,440 wizyt
pytanie zadane 25 stycznia 2016 w C i C++ przez dkarski Obywatel (1,610 p.)

Cześć drodzy,

 

uczę się programowania. Wymyśliłem sobie projekt, w którym chce zliczać wydatki i przychody. Do tego celu stworzyłem sobie klasę Wydatek, w której zapisałem różne zmienne typu string, float czy int.

 

Jak mogę odczytać zmienne jednego obiektu klasy z pod innego programu?

 

void dodaj_koszt()
{
    i++;
    Wydatek z[i];
    cout << "DODAJ KOSZT" << endl;
    cout << "-------------------" << endl;
                                           z[i].id = i;
    cout << "Wpisz koszt: ";        cin >> z[i].koszt;
    cout << "Wpisz date: ";         cin >> z[i].dzien;
    cout << "Wybierz portfel: ";    cin >> z[i].portfel; cout << endl;
    cout << z[i].koszt << " "<<  z[i].dzien << " " << z[i].portfel;
}

void zapisywanie()
{
    i = 0;
    i++;
    fstream plik;
    plik.open("baza.txt",ios::out);
    plik<<z[i].id<<endl;
    plik<<z[i].koszt<<endl;
    plik<<z[i].dzien<<endl;
    plik<<z[i].portfel<<endl;
    plik.close();

}

wyskakuje mi błąd przy procedurze "zapisywanie()" typu;  "z' was not declared in this scope"

 

Próbowałem znaleść potrzebne informacje w różnych tutorialach oraz wyszukiwarce google, ale chyba mam jakąś zaćmę. Czy macie pomysł rozwiązania tego?

5 odpowiedzi

+1 głos
odpowiedź 25 stycznia 2016 przez niezalogowany
wybrane 25 stycznia 2016 przez dkarski
 
Najlepsza
Wydatek z[i] (tak się nie powinno tworzyć tablic o zmiennym rozmiarze) jest definiowane w funkcji dodaj_koszt. Destruktor jest wywołowany w momencie napotkania } w funkcji dodaj_koszt. Dla każdej innej funkcji ta tablica już nie istnieje!
komentarz 25 stycznia 2016 przez dkarski Obywatel (1,610 p.)
Ok, doszedłem do wniosku, że tworząc classe, tylko by stworzyć obiekty, które pomogły by mi posłużyć się jedną nazwą tablicy tylko z innymi atrybutami. Komplikuje sobie pracę z kodem, bo może łatwiej będzie po prostu posłużyć się tablicami nazw atrybutów. Dziękuję za zaangażowanie i wskazany kierunek .
+1 głos
odpowiedź 25 stycznia 2016 przez maciek061 Gaduła (4,490 p.)

Przed atrybutami w klasie umieść klauzule public: 

komentarz 25 stycznia 2016 przez dkarski Obywatel (1,610 p.)

Maćku,

 

jest umieszczona i pomimo to wciąż nie działa.

 

class Wydatek
{
public:
int id;
float koszt;
int dzien, miesiac, rok;
int portfel;
};

 

komentarz 25 stycznia 2016 przez maciek061 Gaduła (4,490 p.)
Wszystkie pliki poprawnie zainkludowane? (używa się cudzysłowia a nie nawiasów <>
komentarz 25 stycznia 2016 przez dkarski Obywatel (1,610 p.)
Wszystko poprawnie, podsyłam cały projekt.

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <sstream>
#include <fstream>
#include "class.h"

using namespace std;
void menu();
void wybor();
void dodaj_koszt();
void dodaj_przychod();
void zamykanie();
void zapisywanie();
int i = 0;
float suma_wydatkow;
float suma_przychodow;
int nazwa;
bool zamknij = false;
bool czy_zapisac = true;

int main()
{
    while(zamknij == false)
    {
    menu();
    wybor();
    }
    return 0;
}

void menu()
{
    cout << endl;
    cout << "Suma kosztow: "<<suma_wydatkow << endl;
    cout << "Suma przychodow: "<<suma_przychodow << endl<< endl;
    /* cout << "-------------------" << endl; */
    cout << "MENU GLOWNE" << endl;
    cout << "-------------------" << endl;
    cout << "1. Dodaj koszt." << endl;
    cout << "2. Dodaj przychod." << endl;
    cout << "3. Zamknij program." << endl;
    cout << "-------------------" << endl << endl;
}

void wybor()
{
    char wybor;
    cout << "Dodaj: "; wybor = getch();
    cout << endl;
    system("cls");
    switch(wybor)
    {
        case '1': dodaj_koszt();
        break;

        case '2': //dodaj_przychod();
        break;

        case '3': zamykanie();
        break;
        default: cout << "Nie ma takiej opcji w menu!";
    }
}
void dodaj_koszt()
{
    i++;
    Wydatek z[i];
    int z[i].id;
    int z[i].koszt;
    int z[i].dzien;
    int z[i].portfel;
    cout << "DODAJ KOSZT" << endl;
    cout << "-------------------" << endl;
                                           z[i].id = i;
    cout << "Wpisz koszt: ";        cin >> z[i].koszt;
    cout << "Wpisz date: ";         cin >> z[i].dzien;
    cout << "Wybierz portfel: ";    cin >> z[i].portfel; cout << endl;
    cout << z[i].koszt << " "<<  z[i].dzien << " " << z[i].portfel;
}
void dodaj_przychod();

void zamykanie()
{
    do
    {
        char wybor;
        cout << "Czy zapisac zmiany przed zamknieciem programu? (T/N)" << endl; wybor = getch();
        switch(wybor)
        {
            case 't': zapisywanie(); czy_zapisac = true; zamknij = true; break;
            case 'n': zamknij = true; czy_zapisac = true; break;
            default: system("cls"); cout << "Wpisz T (tak) lub N (nie)!" << endl << endl ; czy_zapisac = false;
        }
    }while(czy_zapisac == false);

}

void zapisywanie()
{
    i = 0;
    i++;
    fstream plik;
    plik.open("baza.txt",ios::out);
    plik<<z[i].id<<endl;
    plik<<z[i].koszt<<endl;
    plik<<z[i].dzien<<endl;
    plik<<z[i].portfel<<endl;
    plik.close();

}

 

#include <iostream>

using namespace std;

class Wydatek
{
public:
int id;
float koszt;
int dzien, miesiac, rok;
int portfel;
};

class Przychod
{

};

 

komentarz 25 stycznia 2016 przez maciek061 Gaduła (4,490 p.)
W tej chwili jestem zajęty, ale popatrzę później.
komentarz 25 stycznia 2016 przez maciek061 Gaduła (4,490 p.)
Szczerze mówiąc nie wiem.

Też kiedyś miałem podobny problem.
+1 głos
odpowiedź 25 stycznia 2016 przez Ceki Mądrala (5,310 p.)

dane z funkcji dodaj_koszt() po prostu nie są widoczne przez funkcję zapisywanie() :) . Mój pomysł jest taki żeby stworzyć coś typu globalną rozszerzalną tablice, a skoro tablica wspomniana tutaj ma być taką która zmienia rozmiar, polecam ze skorzystania z szablonu vector. Na początku zainkulduj:

#include <vector>

a potem stwórz taką globalną rozszerzalną "Tablicę" pisząc:

vector<Wydatek> nazwaZmiennej;

a jeśli przyjdzie ci skorzystać z "nazwaZmiennej" posłuż się dokumentacją:

http://cpp0x.pl/dokumentacja/standard-C++/vector/819   ;)

komentarz 25 stycznia 2016 przez dkarski Obywatel (1,610 p.)
Dzięki za Twój pomysł, zrezygnuję jednak z tworzenia klasy, bo w cele mi w tym kodzie nie jest potrzebna. Chciałem zbyt mocno...
komentarz 26 stycznia 2016 przez Ceki Mądrala (5,310 p.)
Moim zdaniem powinieneś spróbować, jeśli ci się uda, gwarantuje ci, że będziesz miał o wiele większą satysfakcję :)
komentarz 26 stycznia 2016 przez dkarski Obywatel (1,610 p.)
Ceki, zgodzę się, że gdyby mi to się udało, to bym zrobił, jak zakładałem za pierwszym razem. Pytanie tylko, czy jest to dobra droga, czy to dobra technika programowania trzymać pamięć zmiennej, tak długo. Zastanawiam się, nad optymalizacją, tak kody, by pamięć zmienna została wykorzystana od razu dla celu, którego została utworzona :)
0 głosów
odpowiedź 25 stycznia 2016 przez Sedi Stary wyjadacz (10,200 p.)

Hmm, myślę, że Twój problem rozwiązałoby dodanie po prostu 

Wydatek z[i];

Z racji tego, że nie chodzi Ci o tworzenie zupełnie nowego obiektu, najprościej byłoby połączyć dodaj_koszt i zapisywanie w jedno.

Jeśli lubisz się bawić możesz spróbować z static, które są wspólne dla wszystkich obiektów.

Pozdrawiam

–1 głos
odpowiedź 25 stycznia 2016 przez niezalogowany
Poczytaj o zasięgu zmiennych a potem spójrz na swój kod.
komentarz 25 stycznia 2016 przez dkarski Obywatel (1,610 p.)
badbullpl,

 

sugerujesz, że powinienem zdeklarować tablice z? Tylko Jakiego typu, gdyby zmienna przechowywała strungi oraz floaty?

 

probowałem na samych intach i coś nie dziala wciąż.
komentarz 25 stycznia 2016 przez niezalogowany
Czytałeś to o co prosiłem. Jeśli tak to wiesz, że zmienne są widoczne w zasięgu klamr. Czyli dla funkcji zapisywanie tablica z nie istnieje. Tablica z istniej tylko w funkcji dodaj_koszt.
komentarz 25 stycznia 2016 przez dkarski Obywatel (1,610 p.)
Tak, przeczytałem z zrozumieniem, dlatego zapytałem, jak mogę stworzyć zmienną globalną dla tablicy, która przechowuje mi atrybuty :)
komentarz 25 stycznia 2016 przez niezalogowany
Normalnie, poza ciałem jakiejkolwiek funkcji.

Podobne pytania

+1 głos
3 odpowiedzi 390 wizyt
0 głosów
0 odpowiedzi 1,570 wizyt
pytanie zadane 1 czerwca 2021 w C i C++ przez ::{}:: Gaduła (3,890 p.)

93,604 zapytań

142,529 odpowiedzi

322,997 komentarzy

63,092 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

Kursy INF.02 i INF.03
...