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

Szablony klas

Object Storage Arubacloud
0 głosów
400 wizyt
pytanie zadane 14 lutego 2019 w C i C++ przez Sic Dyskutant (8,510 p.)

Napisałem krotki programu, który ma na celu wykorzystywać szablony klas. Korzystam z nich po raz pierwszy i nawet przez zaglądając do innych źródeł nie wiem jak rozwiązać problem programu. Nie rozumiem co może być nie tak, wielokrotnie nanosiłem poprawki i pojawiały się te same błędy.

#include <string>
#include <string.h>
#include <iostream>
#include <stdlib.h>

template <typename Type = std::string> // lub <class Type>
class Kosciol
{
	Type parafia;
public:
	Kosciol() { parafia = '\0'; }
	virtual void Show() const;
};

template <typename Type = double>
class Oltarz : public Kosciol
{
	Type dl_oltarza;
	Type sz_oltarza;
public:
	Oltarz() { dl_oltarza = 0.0; sz_oltarza = 0.0; }
	void Show() const;
};

template <typename Type>
void Kosciol<Type>::Show() const
{
	std::cout << "Parafia: " << parafia << std::endl;
}

template <typename Type>
void Oltarz<Type>::Show() const
{
	std::cout << "Dlugosc oltarza: " << dl_oltarza << std::endl;
	std::cout << "Szerokosc oltarza: " << sz_oltarza << std::endl;
}

template <typename Type>
void Set(const Type & item)
{
	std::cout << "Podaj nazwe parafii: ";
	std::getline(std::cin, item.parafia);
	std::cout << "Podaj dlugosc oltarza: ";
	std::cin >> item.dl_oltarza;
	std::cout << "Podaj szerokosc oltarza: ";
	std::cin >> item.sz_oltarza;
}

template <typename Type> // nie wolno deklarowac wewnątrz funkcji
int main()
{
	Oltarz<Type>obiekt;
	Set(obiekt);
	obiekt.Kosciol<Type>::Show();
	obiekt.Oltarz<Type>::Show();

	system("pause");
	return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 14 lutego 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 14 lutego 2019 przez Sic
 
Najlepsza

Um... to na wielu poziomach wygląda dziwnie.

Proponuję, żebyś najpierw rozpisał to wszystko bez szablonów i upewnił się że mają sens, a dopiero potem oszablonował to, co potrzebujesz.

Z konkretów, kilka z brzegu:

template <typename Type> // nie wolno deklarowac wewnątrz funkcji
int main()

main() nie może być szablonem - nie ma sensu, by był. Skąd ma wiedzieć, jaki jest argument szablonu?

    obiekt.Kosciol<Type>::Show();
    obiekt.Oltarz<Type>::Show();

Nawet bez szablonów nie wiem, co tu chcesz osiągnąć :/

void Set(const Type & item)
{
    std::cout << "Podaj nazwe parafii: ";
    std::getline(std::cin, item.parafia);

Próbujesz modyfikować obiekty przez const referencje. Ponadto, item.parafia jest prywatne.

class Oltarz : public Kosciol

Czemu ołtarz jest kościołem?

komentarz 14 lutego 2019 przez Sic Dyskutant (8,510 p.)
W takim razie jaki jest sens korzystania z nich, bo na to odpowiedzi też nikt nie podał. Rozpisałem początkowo, jednak korzystając z pewnego źródła wzorowałem się na wykorzystaniu szablonów, jednak u mnie jest błąd (kompilator ciągle uważa, że szablon nie posiada argumentów). "Kościół ma-coś ".
komentarz 14 lutego 2019 przez j23 Mędrzec (194,920 p.)
edycja 14 lutego 2019 przez j23

W takim razie jaki jest sens korzystania z nich

Pytasz o szablony? std::array czy std::vector jest idealnym przykładem wykorzystania szablonów.

kompilator ciągle uważa, że szablon nie posiada argumentów

Kosciol jest szablonem, więc:

template <typename Type = double>
class Oltarz : public Kosciol<>
{
   ...

 

Kosciol() { parafia = '\0'; }

Jeśli już, to

Kosciol() 
    :parafia() 
{}

parafia jest typu szablonowego, i nie wiadomo, czy ten typ może mieć przypisywany literał znakowy.

komentarz 14 lutego 2019 przez adrian17 Ekspert (344,860 p.)

Pytasz o szablony? std::array czy std::vector jest idealnym przykładem wykorzystania szablonów.

Poszerzę to zdanie: jeśli nie miałeś jeszcze doświadczenia jako użytkownik szablonów - na przykład tych z biblioteki standardowej jak wspomniany std::vector, nie radzę zabierania się za tworzenie własnych szablonów.

"Kościół ma-coś ".

To tej relacji nie realizuje się przez dziedziczenie.

komentarz 14 lutego 2019 przez Sic Dyskutant (8,510 p.)

@j23,

Dziękuję te podpowiedzi pomogły, jednak mam pytanie dlaczego musiałem korzystać z listy?

Zamiast tego pojawił się taki:

1>LINK : fatal error LNK1561: punkt wejścia musi być zdefiniowany

@adrian17

Miałem do czynienia z std::array.

Dlaczego nie mogę relacji wykorzystać w dziedziczeniu ?

komentarz 14 lutego 2019 przez adrian17 Ekspert (344,860 p.)

punkt wejścia musi być zdefiniowany

Jak wygląda Twój main()?

Dlaczego nie mogę relacji wykorzystać w dziedziczeniu ?

Dziedziczenie oznacza, że Ołtarz jest kościołem, nie że kościół ma ołtarz.

komentarz 14 lutego 2019 przez Sic Dyskutant (8,510 p.)

Sprawdzałem na internecie ale nie ma żadnej konkretnej odpowiedzi na rozwiązanie problemu.

template <typename Type> 
int main()
{
	Oltarz<Type>obiekt;
	Set(obiekt);
	obiekt.Kosciol<Type>::Show();
	obiekt.Oltarz<Type>::Show();

	system("pause");
	return 0;
}

Ad. 2.

Wybacz z źródła na którym się opierałem to też brali pod dziedziczenie. W takim moja relacja do czego może się odnieść ?

1
komentarz 14 lutego 2019 przez adrian17 Ekspert (344,860 p.)

Jak mówiłem, nie ma sensu by main() był szablonem. No bo gdzie przekazujesz argumenty do tego szablonu?

Wybacz z źródła na którym się opierałem to też brali pod dziedziczenie. W takim moja relacja do czego może się odnieść ?

Coś źle przeczytałeś.

class Kosciol : public Budynek

Kościół jest budynkiem.

class Kosciol {
  Oltarz oltarz;
}

Kościół ma ołtarz.

komentarz 14 lutego 2019 przez Sic Dyskutant (8,510 p.)
Dziękuję Ci za pomoc, będę to musiał poćwiczyć, bo nie jest to na dzień dzisiejszy dla mnie łatwe.

Podobne pytania

0 głosów
1 odpowiedź 762 wizyt
pytanie zadane 8 grudnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
–1 głos
1 odpowiedź 303 wizyt
pytanie zadane 12 stycznia 2017 w C i C++ przez timrh Mądrala (6,030 p.)
0 głosów
1 odpowiedź 128 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez Szahid Pasjonat (20,930 p.)

92,576 zapytań

141,425 odpowiedzi

319,650 komentarzy

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

...