• 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.

VPS Starter Arubacloud
0 głosów
167 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,100 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ź 300 wizyt
pytanie zadane 9 maja 2018 w PHP przez KoruS Obywatel (1,630 p.)
0 głosów
2 odpowiedzi 340 wizyt
pytanie zadane 12 marca 2020 w C i C++ przez RubiN Początkujący (290 p.)
0 głosów
0 odpowiedzi 76 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...