• 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

0 głosów
4,618 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 437 wizyt
pytanie zadane 16 grudnia 2016 w C i C++ przez programmero Bywalec (2,420 p.)
0 głosów
1 odpowiedź 364 wizyt
pytanie zadane 15 grudnia 2016 w C i C++ przez programmero Bywalec (2,420 p.)
0 głosów
2 odpowiedzi 1,278 wizyt
pytanie zadane 2 lutego 2019 w C i C++ przez Mavannkas Bywalec (2,290 p.)

93,776 zapytań

142,732 odpowiedzi

323,384 komentarzy

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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...