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

Problem ze zmienną int static tworzoną w klasie.

Object Storage Arubacloud
0 głosów
168 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez Qbsoon Nowicjusz (150 p.)
edycja 28 grudnia 2018 przez Qbsoon

 

Witam!

Podczas tworzenia obiektu klasy przypisałem mu zmienną typu int jako nazwę, i później odwołuję się do tego obiektu poprzez tą zmienną, np.: lo.info(); (lo to nazwa tej zmiennej). Zmienna tworzona jest w klasie przez: static int lo = 1; (użyłem static, ponieważ wyczytałem, że wtedy wartość zmiennej będzie wspólna pomiędzy wszystkimi obiektami tej klasy)
Przy kompilacji otrzymuję błąd:

error C2864: 'osoba::lo': a static data member with an in-class initializer must have non-volatile const integral type or be specified as 'inline'

note: type is 'int'

 Mam też coś takiego w funkcji main:

switch (os)
			{
			case 1:
				osoba lo;
				lo.dodaj();
				break;
			case 2:
				osoba::usun();
				break;
			case 3:
				osoba::wypisz();
				break;
			case 4:
				lo.info();
				break;
			case 5:
				osb = 1;
				break;
			}

A przy kompilacji dostaję coś takiego:

error C2360: initialization of 'lo' is skipped by 'case' label

note: see declaration of 'lo'

 W outpucie kompilatora pojawia się to 4 razy i te 4 razy odwołuje się do linijek z czterema ostatnimi case-ami.

EDIT: [Zmieniłem komunikaty błędu na te z angielskiego kompilatora]


class osoba
{
public:
	string imie, nazwisko, adres;
	int wiek;
	void dodaj();
	static void usun();
	static void wypisz();
	static int lo = 1;
	static string osoby[101];
	void info();
};

void osoba::dodaj()
{
	cout << "Podaj imię\n";
	cin >> imie;
	cout << "\nPodaj nazwisko\n";
	cin >> nazwisko;
	cout << "\nPodaj adres\n";
	cin >> adres;
	cout << "\nPodaj wiek\n";
	cin >> wiek;
	cout << "\nGotowe\n";
	osoby[lo] = lo+": "+imie + " " + nazwisko;
	lo++;
}

void osoba::usun()
{
	int no;
	cout << "Podaj numer osoby do usunięcia\n";
	cin >> no;
	if (no != lo-1) {
		string ntemp;
		for (int ldel = no; ldel < lo-1; ldel++) {
			osoby[ldel] = osoby[ldel + 1];
		}
	}
	lo--;
}

void osoba::wypisz()
{
	for (int lwyp = 1; lwyp <= lo-1; lwyp++) {
		cout << osoby[lwyp] << endl;
	}
}

void osoba::info()
{
	int ninfo;
	cout << "Podaj numer osoby do wywołania\n";
	cin >> ninfo;
	cout << "\nImię: " << imie << "\nNazwisko: " << nazwisko << "\nAdres: " << adres << "\nWiek: " << wiek << endl;
}
int main()
{
	cout << "Wybieraj:\n 1: Sortowanie\n 2: Osoby\n";
	int c;
	cin >> c;
	cout << endl;
	switch (c)
	{
	case 1:
		[Kod dotyczący sortowania, działa i nie używane jest przy nim nic, co jest używane przy klasie osoba]
		break;

	case 2:
		int os;
		bool osb;
		do {
			cout << "Wybieraj:\n 1: Dodaj osobę\n 2: Usuń osobę\n 3: Wyświetl listę osób\n 4: Wyświetl informacje o osobie\n 5: Koniec programu\n";
			cin >> os;
			cout << endl;
			switch (os)
			{
			case 1:
				osoba lo;
				lo.dodaj();
				break;
			case 2:
				osoba::usun();
				break;
			case 3:
				osoba::wypisz();
				break;
			case 4:
				lo.info();
				break;
			case 5:
				osb = 1;
				break;
			}
		} while (osb != 1);
		break;
	}
    return 0;
}

 

2
komentarz 27 grudnia 2018 przez adrian17 Ekspert (344,860 p.)
Więcej powie, jak pokażesz cały kod - w szczególności tą klasę.
1
komentarz 28 grudnia 2018 przez draghan VIP (106,230 p.)
+1 dla Adriana oraz, na bitowego stwórcę, przestaw język kompilatora na coś ludzkiego, bo komunikaty błędów po polsku są odrażające.

1 odpowiedź

+1 głos
odpowiedź 29 grudnia 2018 przez SimiVoid Pasjonat (19,790 p.)
wybrane 2 stycznia 2019 przez Qbsoon
 
Najlepsza

Po pierwsze nie możesz przypisywać od zmiennej statycznej wartości w klasie. Musisz zrobić to po za nią.

	osoba::lo = 1;

Po drugie nie możesz tworzyć obiektu klasy w pętli switch musisz zrobić to poza lub w osobnej funkcji.

komentarz 2 stycznia 2019 przez Qbsoon Nowicjusz (150 p.)
// Sandbox.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

[Sortowanie]

class osoba
{
public:
	string imie, nazwisko, adres;
	int wiek;
	void dodaj();
	static void usun();
	static void wypisz();
	static string osoby[101];
	static int lo;
	void info();
};

void osoba::dodaj()
{
	cout << "Podaj imię\n";
	cin >> imie;
	cout << "\nPodaj nazwisko\n";
	cin >> nazwisko;
	cout << "\nPodaj adres\n";
	cin >> adres;
	cout << "\nPodaj wiek\n";
	cin >> wiek;
	cout << "\nGotowe\n";
	osoby[lo] = lo+": "+imie + " " + nazwisko;
	lo++;
}

void dodajs()
{
	osoba lo;
	lo.dodaj();
}

void osoba::usun()
{
	int no;
	cout << "Podaj numer osoby do usunięcia\n";
	cin >> no;
	if (no != lo-1) {
		string ntemp;
		for (int ldel = no; ldel < lo-1; ldel++) {
			osoby[ldel] = osoby[ldel + 1];
		}
	}
	lo--;
}

void osoba::wypisz()
{
	for (int lwyp = 1; lwyp <= lo-1; lwyp++) {
		cout << osoby[lwyp] << endl;
	}
}

void osoba::info()
{
	int ninfo;
	cout << "Podaj numer osoby do wywołania\n";
	cin >> ninfo;
	cout << "\nImię: " << imie << "\nNazwisko: " << nazwisko << "\nAdres: " << adres << "\nWiek: " << wiek << endl;
}

void infos()
{
	lo.info();
}


int main()
{
	cout << "Wybieraj:\n 1: Sortowanie\n 2: Osoby\n";
	int c;
	cin >> c;
	cout << endl;
	osoba::lo = 1;
	bool b = 0;
	switch (c)
	{
	case 1:
		[Sortowanie]
		break;

	case 2:
		int os;
		bool osb;
		do {
			cout << "Wybieraj:\n 1: Dodaj osobę\n 2: Usuń osobę\n 3: Wyświetl listę osób\n 4: Wyświetl informacje o osobie\n 5: Koniec programu\n";
			cin >> os;
			cout << endl;
			switch (os)
			{
			case 1:
				dodajs();
				break;
			case 2:
				osoba::usun();
				break;
			case 3:
				osoba::wypisz();
				break;
			case 4:
				infos();
				break;
			case 5:
				osb = 1;
				break;
			}
		} while (osb != 1);
		break;
	}
    return 0;
}

Tak teraz wygląda kod. Ale tym razem i tak jest problem, ponieważ kompilator stwierdził, że zmienna lo użyta w funkcji void infos() nie została wcześniej zadeklarowana.

error C2065: 'lo': undeclared identifier

Próbowałem wskaźnikami przekazań zmienną do funkcji w ten sposób:

void infos(int *loi)
{
	loi.info();
}		



case 4:
	infos(&osoba::lo);
	break;

Ale wtedy dostaję taki błąd:

error C2228: left of '.info' must have class/struct/union

note: type is 'int *'

Podobne pytania

0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 9 maja 2018 w PHP przez KoruS Obywatel (1,630 p.)
0 głosów
2 odpowiedzi 350 wizyt
pytanie zadane 12 marca 2020 w C i C++ przez RubiN Początkujący (290 p.)
0 głosów
0 odpowiedzi 80 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

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

...