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

question-closed Niekompletny typ nie jest dozwolony

Object Storage Arubacloud
0 głosów
3,733 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez Suiko Początkujący (350 p.)
zamknięte 7 maja 2017 przez Suiko
class Ananas
{
public:
	char ip[] = "012.93.81.53";
	char login[] = "l7184916249";
	char password[] = "f1aNSuL17UIoeM";
};

Próba kompilacji tego kodu wyświetla następujący błąd: "incomplete type is not allowed." Co ciekawe, błąd dotyczy tylko pierwszych dwóch zmiennych, ip i loginu, password jest zapisany poprawnie. Oczywiście dane są zmyślone, jedynie zapisane w identycznym formacie.Czy wiecie może w jaki sposób to naprawić?

komentarz zamknięcia: Nieaktualne, niekonkretne.
komentarz 7 maja 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
Nie znam obiektowki, ale w kalsie nie musi byc konstruktro i dekonstruktor?
komentarz 7 maja 2017 przez Suiko Początkujący (350 p.)
Jeżeli nie zostanie zadeklarowany to zostanie użyty tzw. domyślny konstruktor oraz domyślny destruktor, narzędzia dostarczone przez sam język.

2 odpowiedzi

+1 głos
odpowiedź 7 maja 2017 przez Evelek Nałogowiec (28,960 p.)
wybrane 8 lutego 2021 przez Suiko
 
Najlepsza
class Klasa {
public:
	const char *ip = "012.93.81.53";
    const char *login = "l7184916249";
	const char *password = "f1aNSuL17UIoeM";
	
};

 

komentarz 7 maja 2017 przez Suiko Początkujący (350 p.)
Zrobienie tego w ten sposób zwraca kolejny błąd już przy próbie samego wywołania:

"a nonstatic member reference must be relative to a specific object."
komentarz 7 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Pokaż więcej kodu i jak próbujesz to wywołać.
komentarz 7 maja 2017 przez Suiko Początkujący (350 p.)
const char * Klasa::zwracajip()
{
	return ip;
}

int Klasa::funkcja()
{
char temp2513[] = zwracajip();
...
return 0
}

Tutaj funkcja zwracajip() podkreśla się na czerwono właśnie z powyższym błędem. Znak przy temp2512 czy * czy [] czy sama zmienna nie zmienia treści błędu.

komentarz 7 maja 2017 przez Evelek Nałogowiec (28,960 p.)
edycja 7 maja 2017 przez Evelek
#include <iostream>
using namespace std;

class Klasa {
public:
	const char *ip = "012.93.81.53";
	const char *login = "l7184916249";
	const char *password = "f1aNSuL17UIoeM";

	const char *zwracajip() {
		return ip;
	}

	void funkcja() {
		const char *temp2513 = zwracajip();
		cout << ip << endl;
		cout << temp2513 << endl;
	}
};

int main() {
	Klasa obiekt;
	obiekt.funkcja();

	cin.get();
}
komentarz 7 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Pamiętaj, że deklaracja tablicy oznacza przydział pamięci dla danych, a deklaracja wskaźnika to zaledwie przydział pamięci dla adresu.
+1 głos
odpowiedź 7 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Zrób jak napisał evelek, albo :
 

class Ananas
{
public:
    char ip[13];
    char login[12];
    char password[14];
};

Gdzie w nawiasach kwadratowych piszesz maksymalną długość łańcucha, który może się tam pojawić + 1 (w C-stringach potrzeba jeszcze jeszcze miejsca na znak NULL oznaczający koniec łańcucha). Polecam poczytać o C-stringach i o klasie Stringsmiley

No i przede wszystkim w definicji klasy nie możesz sobie zainicjalizować tak po prostu pól, musisz użyć konstruktora albo publicznej funkcji składowej, która umożliwi zmianę zawartości pól z zewnątrz. No chyba, że twoje pola mają być publiczne (tak jak podałeś w swoim kodzie), wtedy możesz zmienić ich wartość bezpośrednio.

komentarz 7 maja 2017 przez Evelek Nałogowiec (28,960 p.)

No i przede wszystkim w definicji klasy nie możesz sobie zainicjalizować tak po prostu pól, musisz użyć konstruktora albo publicznej funkcji składowej, która umożliwi zmianę zawartości pól z zewnątrz.

No właśnie możesz i właśnie to zrobiłem przed chwilą i mogą to być nawet składowe prywatne. Przykład:

#include <iostream>

class Class {
private:
	int digit = 10;
	int sth;
public:
	Class(int sth = 20) : sth(sth) {}
	inline void Show() const {
		std::cout << digit << std::endl;
		std::cout << sth << std::endl;
	}
};

int main() {
	Class object;
	object.Show();

	std::cin.get();
}

 

komentarz 7 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
Ups, faktycznie, od C++11 tak można, zwracam honor.
Chociaż jak dla mnie i tak bardziej czytelnie będzie to po prostu uwzględnić inicjalizację zmiennych składowych w konstruktorze.

Podobne pytania

0 głosów
0 odpowiedzi 217 wizyt
pytanie zadane 16 grudnia 2016 w C i C++ przez programmero Bywalec (2,420 p.)
0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 15 grudnia 2016 w C i C++ przez programmero Bywalec (2,420 p.)
0 głosów
2 odpowiedzi 759 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez Mavannkas Bywalec (2,290 p.)

92,632 zapytań

141,500 odpowiedzi

319,878 komentarzy

62,011 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!

...