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

Rozlozenie projektu na jak najmniej plikow. Obiektowka C++

Object Storage Arubacloud
0 głosów
372 wizyt
pytanie zadane 16 lutego 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
Czesc dawno nie bawilem sie w wydzielanie kodu na mniejsze czesci tylko robilem syf i piszac jakies programy dydaktyczne uczac sie nowych bibliotek i ogolnie ciekawostek w C++.

Teraz juz na powaznie sie zabieram za projekt ale mam pewien problem(w sumie to bardziej wielkie pragnienie). Chodzi o to ze w pliku naglowkowym .hpp chce miec zapisane tylko deklaracje klas i poinformowania kompilatora ze istnieja jakies metody tej klasy a metody kazdej z klas chcialbym miec w osobnym pliku .cpp i stad moje pytanie jakim operatorem to zrobic chcialem to zrobic za pomoca "::" ale wywalilo mi blad ze jest to niepoprawne.

A druga kwestia to czy moge wydzielic te metody do tego stopnia ze mechanizm wczytywania danych bedzie juz w innym zupelnie pliku np. teraz powiedzmy to podczas pisania podstawy pod wszystko dane bede pobieral przez brzydkie okno konsoli a w przyszlosci odpowiednio modyfikujac ten plik bede mogl je pobierac za pomoca jakiegos raficznego interfejsu a nawet zdalnie albo cokolwiek.

Jezeli niejasno wyrazilem swoja intencje to postaram sie wyjasnic.

Z gory dzieki za pomoc

PS:Prosilbym odrazu o napisanie mi w jaki sposob deklaruje sie odniesienia do metod danych klas itp. moze istnieje cos bardziej zaawansowanego niz to "::". Z gory dzieki za pomoc.

1 odpowiedź

0 głosów
odpowiedź 16 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

W pliku nagłówkowym z deklaracją klasy (plik.hpp):

#ifndef PLIK_HPP // Nazwa makra dowolna
#define PLIK_HPP

class Klasa
{
public:
	Klasa();
	void metoda1();
	int metoda2();
};

#endif

W pliku źródłowym z definicjami metod (plik.cpp):

#include "plik.hpp"

Klasa::Klasa()
{
	//...
}

void Klasa::metoda1()
{
	//...
}

int Klasa::metoda2()
{
	//...
}

Oczywiście, że możesz - bardzo dobrym założeniem jest oddzielenie części logicznej programu i części wizualnej - dzięki temu nasz program i jego kod będą bardziej uniwersalne.

komentarz 16 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Aha czyli tak jak zrobilem z wyjatkiem ze w pliku .hpp zamiast void metoda(); zrobilem void metoda(){}

Wielkie dzieki a jezeli chodzi o druga czesc pytania to jak zamknac takowa funkcje ktora odpowiadala za wczytywanie najlepiej zamknac w osobna biblioteke czy miec ja zawsze inline w kodzie ?
komentarz 16 lutego 2016 przez 0xf Dyskutant (8,180 p.)
hmmm sprecyzuje powiedzmy ze wklasie mamy string name. I ta funkcja odpowiadalaby za wczytanie tego name poki co wiadomo bedzie to glupie cin>> bo robie dopiero mechanizm ktory ma dzialac a za upiekszanie go potem sie zabiore. Mi sie wydaje ze najlepiej bedzie zamknac taka funkcje w biblioteke ale nie wiem moze sa rozwiazania. Pozdrawiam.
komentarz 16 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

Jak w osobną bibliotekę? Chodzi ci o inny moduł (plik)? Jeśli ma ci to pomóc w przejrzystości kodu, to czemu nie.

komentarz 16 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Tak chodzi o przejrzystosc kodu wiem ze to dziwne zamykac jedna funkcje za biblioteke ale chodzi najzwyczajniej o to zeby moc to pozniej szybko zmodyfikowac bez modyfikowania innych plikow. Poprostu napisze jedna funkcje od nowa i zrobione nic wiecej nie musze zrobic wszedzie biblioteka jest dodana i funkcja wywolana tylko zmienie jej kod i zamiast jakies konsoli bede mogl potem dane wpisywac przez no nie wiem jakies ladne okienko.
komentarz 17 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Ok zadeklarowalem sobie ale jest problem w pliku naglowkowym mam tam void ...... (); a w cpp void Klasa::.......(){} i jest redefinition of ..........
komentarz 20 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Mialbym w sumie jeszcze jedno pytanie w pliku hpp mam cos takiego :         template<typename T,typename... Rest> void create(T& x, Rest... rest);

a pliku cpp sprobowalem sie do tego odwolac w taki sposob : template<typename T, typename... Rest> void TabelaPostgre::create(T& x, Rest... rest)

Mam to zaznaczone jako blad o taki : error: prototype for ‘void TabelaPostgre::create(T&, Rest ...)’ does not match any in class ‘TabelaPostgre’|
komentarz 20 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
Niestety, ale przy szablonach definicja musi się znajdować razem z deklaracją, czyli, w twoim przypadku, w pliku nagłówkowym klasy.
komentarz 20 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Czyli jak kod funkcji ma byc w pliku hpp ? Bo w sumie skoro w cpp nie moze to jak mam okreslic jaki ma byc typ w typ szablonie itp.
komentarz 20 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
Nie trzeba określać żadnego typu - przecież to jest główna zaleta szablonów - wystarczy, że zdefiniujesz cały szablon funkcji w pliku nagłówkowym (w definicji klasy).

Podobne pytania

+1 głos
1 odpowiedź 115 wizyt
0 głosów
2 odpowiedzi 99 wizyt
pytanie zadane 5 marca 2016 w C i C++ przez Rushes Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 271 wizyt
pytanie zadane 27 grudnia 2018 w Hostingi, domeny, usługi przez niezalogowany

92,674 zapytań

141,574 odpowiedzi

320,045 komentarzy

62,038 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

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!

...