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

Zmienne w pliku nagłówkowym

Object Storage Arubacloud
0 głosów
738 wizyt
pytanie zadane 4 października 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)

Witam, mam problem z deklaracją zmiennych w pliku .h

//.h
#pragma once
#include <iostream>
using namespace std;
class stage
{
	int numer;

public:
	stage(int);
	~stage();
};
//.cpp
#include <iostream>
#include "stage.h"

using namespace std;
class stage
{
	numer = 1;
public:
	stage()
	{

	}
	~stage();
};

w pliku .cpp nie mogę korzystać ze zmiennej numer zadeklarowanej w pliku .h, kompilator uważa ją za niezadeklarowaną. Z góry dziękuję

1 odpowiedź

0 głosów
odpowiedź 4 października 2019 przez adrian17 Ekspert (344,860 p.)
Drugi raz definiujesz tą samą klasę - nie tak to się robi.

Nie deklarujesz też zmiennej, tylko pole klasy. Co konkretnie masz na myśli przez "numer = 1"? Że numer==1 w każdej instancji? Że to domyślna wartość? Coś innego?
komentarz 4 października 2019 przez Kacper Lasota Początkujący (250 p.)

narazie próbuje zrozumieć czemu to nie działa, wcześniej próbowałem zadeklarować zmienne w funkcji, także w plikach nagłówkowych i też nie działało, tutaj akurat chcę zdefinjować wartość  numer=1

 

komentarz 4 października 2019 przez Kacper Lasota Początkujący (250 p.)

To

//.h

void nowa()
{
string nazwa;
    int hp, stage, armor;
}

//.cpp

void nowa()
{
    cout << "Podaj nazwe postaci: ";
    cin >> nazwa;

    fstream plik;

    plik.open(nazwa, ios::out);
    plik << nazwa << endl << stage << endl << hp << endl << armor << endl;
    plik.close();
}

także nie działało

komentarz 4 października 2019 przez Munvik Dyskutant (9,350 p.)

Kacper Lasota w plikach .h co najwyżej możesz napisać deklarację funkcji a w .cpp jej ciało. 

Czyli w .h piszesz

void nowa();

A w .cpp 

void nowa()
{
    cout << "Podaj nazwe postaci: ";
    cin >> nazwa;
 
    fstream plik;
 
    plik.open(nazwa, ios::out);
    plik << nazwa << endl << stage << endl << hp << endl << armor << endl;
    plik.close();
}

Będzie to jedna funkcja i jak będziesz chciał jej użyć gdzies w kodzie dołączasz plik .h tam i używasz jej. 

Klasy tak samo w plikach .h deklaracja ich a w plikach .cpp definicje funkcji.

komentarz 4 października 2019 przez Kacper Lasota Początkujący (250 p.)
Okej, a kiedy mogę zadeklarować zmienne w pliku .h i używać w .cpp
komentarz 4 października 2019 przez adrian17 Ekspert (344,860 p.)

A w .cpp 

Jeszcze w .cpp zadeklaruj te zmienne ;)

komentarz 4 października 2019 przez adrian17 Ekspert (344,860 p.)

Okej, a kiedy mogę zadeklarować zmienne w pliku .h i używać w .cpp

Możesz najwyżej zmienne globalne (co też powinno być unikane) - a tak to nigdy. Nie powiedziałeś jeszcze, po co chcesz tak to robić.

komentarz 4 października 2019 przez Kacper Lasota Początkujący (250 p.)

Czyli tego nie powinno się robić, tak?

 

komentarz 4 października 2019 przez adrian17 Ekspert (344,860 p.)

Czyli tego nie powinno się robić tak?

Tutaj jest OK - zdefiniowałeś klasę z polami day, month, year etc; a w .cpp definiujesz jej metodę, która operuje na polach instancji tej klasy.

komentarz 4 października 2019 przez Kacper Lasota Początkujący (250 p.)

Nie zamieściłem tego, ale numer miał być użyty w konstruktorze klasy, ale dostaje błąd, że zmienna jest niezadeklarowana (w .h ją deklaruje, a w .cpp definiuje ją jako 1 i używam w konstruktorze i wtedy dostaje błąd)

 

komentarz 4 października 2019 przez adrian17 Ekspert (344,860 p.)

numer miał być użyty

(W sensie jako pole klasy czy argument konstruktora?)

.cpp definiuje ją jako 1

(Ale co to w ogóle ma znaczyć? Cofam do wcześniejszego pytania:)

Co konkretnie masz na myśli przez "numer = 1"? Że numer==1 w każdej instancji? Że to domyślna wartość? Coś innego?

W każdym razie:

Jeśli w definicji klasy (np w .h) masz `int numer;`, to już instancje klasy będą miały pole `numer` z którego możesz korzystać np w konstruktorze.

komentarz 4 października 2019 przez Munvik Dyskutant (9,350 p.)
Pokaż teraz kod, który Ci nie działa.
komentarz 4 października 2019 przez Kacper Lasota Początkujący (250 p.)

(W sensie jako pole klasy czy argument konstruktora?)

jako argument

(Ale co to w ogóle ma znaczyć? Cofam do wcześniejszego pytania:)

numer = 1

Jeśli w definicji klasy masz `int numer;`, to już instancje klasy będą miały pole `numer` z którego możesz korzystać np w konstruktorze.

//,h
class stage
{
	int numer;

public:
	stage(int);
	~stage();
};


//.cpp
#include <iostream>
#include "stage.h"

using namespace std;

class stage
{
	numer = 1;
public:
	stage(int n)
	{
		numer = n;
	}
	~stage();
};

dostaje błąd  "ta deklaracja nie zawiera klasy magazynu lub specyfikatora typu

 

komentarz 4 października 2019 przez adrian17 Ekspert (344,860 p.)

(W sensie jako pole klasy czy argument konstruktora?)

jako argument

No to jeśli argument konstruktora, to przecież zupełnie co innego - po prostu argument funkcji:

stage(int numer)
{
   // ...i tyle - "używaj" numer jak chcesz
}
numer = 1;

A to po prostu wyrzuć, takich rzeczy nigdy się w klasie nie umieszcza.

komentarz 4 października 2019 przez Kacper Lasota Początkujący (250 p.)
Dobra, dzięki w klasie już ogarniam, ale nadal nie rozumiem czemu nie mogę zadeklarować zmiennych funkcji w pliku .h tak żeby w .cpp ich używać bez deklaracji
komentarz 4 października 2019 przez adrian17 Ekspert (344,860 p.)
zadeklarować zmiennych funkcji w pliku .h tak żeby w .cpp ich używać bez deklaracji

Bo... to nie ma wartości? Deklaracja funkcji jest po to, żeby powiedzieć użytkownikom funkcji, że... jest taka funkcja i mogą ją wywołać. Zmienne w jej środku są już częścią jej implementacji, to co mają one użytkowników deklaracji interesować.

komentarz 4 października 2019 przez Munvik Dyskutant (9,350 p.)
W pliku .cpp nie tworzysz klasy. Ona już jest w .h.

W pliku .cpp możesz używać tych zmiennych w dowolnych metodach.
komentarz 4 października 2019 przez adrian17 Ekspert (344,860 p.)

Poza tym, w funkcji nie ma "jednej" definicji zmiennej. Patrz przykłady:

void f(){
    {
        int a; // w tym bloku mamy zmienną liczbową a
    }
    // w tym nie
    {
        string a; // a w tym zmienną stringową a
    }
}

Albo

void f(){
    for (int i = 0; i < 5; ++i) {
        Obiekt o; // 5 razy tworzy i niszczy obiekt klasy Obiekt
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 20 czerwca 2022 w C i C++ przez MichaelM Bywalec (2,520 p.)
–1 głos
1 odpowiedź 368 wizyt
pytanie zadane 27 lipca 2017 w C i C++ przez kvbq Obywatel (1,490 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 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!

...