Reklama
Pokazuje wyniki od 1 do 14 z 14

Temat: Podział kodu na 3 pliki - pilna pomoc

  1. #1
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny Podział kodu na 3 pliki - pilna pomoc

    Kod:
    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    
    using namespace std;
    
    struct location {
    float x;
    float y;
    };
    
    
    class Circle
    {
    
    
        private:
            struct location location;
            float radius;
    
    
        public:
        static int counter;
    
        static int method()
          {
            return counter;
          }
    
    
        Circle()
           {
            location.x = 0;
            location.y = 0;
            radius = 0;
            counter++;
        }
    
        Circle(struct location tm, float rad)
        {
    
            location = tm;
            radius = rad;
            counter++;
        }
    
       ~Circle()
       {counter--;}
    
    
            void set_location(struct location temp)
            {
                location = temp;
            }
    
            struct location get_location()
            {
                return location;
            }
    
            void set_radius(float promien)
            {
                radius = promien;
            }
    
            float get_radius()
            {
                return radius;
            }
    
    
            float area()
            {
                return M_PI * pow(radius,2);
            }
    
            float circumference()
            {
                return 2 * M_PI * radius;
            }
    
    
        Circle operator+(Circle & r)
        {
        struct location u;
        u.x = ((r.get_location().x) + (get_location().x))/2;
        u.y = ((r.get_location().y) + (get_location().y))/2;
        float u_radius = r.get_radius()+get_radius();
        Circle nowy(u,u_radius);
        return nowy;
        }
    
        Circle operator*( double & t)
        {
        struct location u;
        u.x = get_location().x;
        u.y = get_location().y;
        float u_radius = get_radius()*t;
        Circle nowy(u,u_radius);
        return nowy;
        }
    };
    int Circle::counter = 0;
    
    
    
    
    
    int main()
    {
        double m=6.,n=2,b=3;
        location w;
        w.x=2.;
        w.y=4.;
    
    
        Circle circle;
        circle.set_location((location){ 10., 12. });
        circle.set_radius(15.);
        Circle two(w,6.);
    
        Circle three = circle + two;
        Circle four = circle * m;
        Circle five = circle*n;
        Circle six = three + two;
    
        cout << three.get_location().x<<endl;
        cout << three.get_location().y<<endl;
        cout << three.get_radius()<<endl;
        cout <<endl;
        cout << four.get_location().x<<endl;
        cout << four.get_location().y<<endl;
        cout << four.get_radius()<<endl;
        cout <<endl;
        cout << five.get_location().x<<endl;
        cout << five.get_location().y<<endl;
        cout << five.get_radius()<<endl;
        cout <<endl;
        cout << six.get_location().x<<endl;
        cout << six.get_location().y<<endl;
        cout << six.get_radius()<<endl;
        cout <<endl;
        cout <<"Liczba istniejacych obiektow wynosi: " <<Circle::method();
        cout <<endl;
        return 0;
    }
    Mam taki oto działający kod, miałem go napisać w celu nauki tworzenia klas, przeciążania operatorów, tworzenia konstruktorów i zmiennych oraz metod statycznych. Dodatkowo mam polecenie:
    W pierwszym kroku rozbij projekt na trzy pliki. W pierwszym (main.cpp) zawrzyj funkcję main(). W dwóch pozostałych (Circle.h i Circle.cpp) zawrzyj kolejno interfejs i implementację klasy.
    Czy ktoś by mógł to za mnie zrobić tak aby działało? I jeszcze kolejną rzeczą jest to aby definicje funkcji w klasie umieszczać poza nią, ale to już raczej sobie poradzę gdy będę miał podzielony kod na 3 pliki

  2. #2
    Avatar Lux
    Data rejestracji
    2008
    Położenie
    Poznań
    Wiek
    30
    Posty
    133
    Siła reputacji
    17

    Domyślny

    Najlepiej zrobić to poprzez utworzenie projektu. W jakim środowisku pracujesz? (dev/visual etc)

  3. Reklama
  4. #3
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    codeblocks

  5. #4
    Avatar Lux
    Data rejestracji
    2008
    Położenie
    Poznań
    Wiek
    30
    Posty
    133
    Siła reputacji
    17

    Domyślny

    Poszukaj czegoś w stylu nowy projekt(Plik - Nowy projekt), lub coś podobnego (nie wiem jak to dokładnie się nazywa w codeblocks), potem dodaj klase (Plik - Dodaj klasę). Wpisujesz nazwę klasy i powinien twój edytor ci utworzyć projekt zawierający trzy pliki. Jeden main.cpp, drugi nazwaklasy.cpp oraz trzeci - nazwaklasy.h z odpowiednimi dyrektywami. No i jak już będziesz to miał to wystarczy przekopiować definicje klasy do pliku .h a deklaracje metod do .cpp, a w main.cpp dołączyć właśnie ten plik .h (#include "nazwaklasy.h").
    Ostatnio zmieniony przez Lux : 25-03-2014, 19:35

  6. #5
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    ale wolał bym to etapami zrobić, bo na razie tworze tylko osobny plik na samą klasę zgodnie raz z jakimś tam tutorialem i teraz drugi raz zgodnie z tym co mi wygenerowało w pliku jak dodałem klase i jest pełno problemów z kompilacją

  7. #6
    Avatar Lux
    Data rejestracji
    2008
    Położenie
    Poznań
    Wiek
    30
    Posty
    133
    Siła reputacji
    17

    Domyślny

    Dobra zarzucę ci małym przykładem z jedną klasą jak to powinno mniej więcej wyglądać.

    main.cpp

    Kod:
    #include <iostream>
    #include "osoba.h"
    
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    
    int main(int argc, char** argv) {
    	
    	Osoba *o1 = new Osoba();
    	o1->ustalImie("Jan");
    	o1->ustalNazwisko("Kowalski");
    	
    	Osoba *o2 = new Osoba();
    	o2->ustalImie("Andrzej");
    	o2->ustalNazwisko("Nowak");
    		
    
    	return 0;
    }
    osoba.h

    Kod:
    #ifndef OSOBA_H
    #define OSOBA_H
    #include <string>
    
    class Osoba
    {
    	public:
    		Osoba();
    		~Osoba();
    		void ustalImie(string b);
    		void ustalNazwisko(string b);
    		
    	protected:
    		string imie;
    		string nazwisko;
    };
    
    #endif
    osoba.cpp

    Kod:
    #include "osoba.h"
    #include <iostream>
    using namespace std;
    
    
    
    Osoba::Osoba()
    {
    	cout << "konstruktor" << endl;
    }
    
    Osoba::~Osoba()
    {
    	cout << "destruktor" << endl;
    }
    
    void Osoba::ustalImie(string b)
    {
    	imie = b;
    }
    
    void Osoba::ustalNazwisko(string b)
    {
    	nazwisko = b;
    }
    Zrób wszystko analogicznie a powinno być ok.

  8. #7
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    no nie działa :/
    A mogę w pierwszym kroku zrobić na razie tylko przeniesienie całej klasy do pliku Circle.h? A reszty pozostawienie tak jak było (tzn definicje funkcji z klasy przeniose dopiero później bo już na etapie samego przeniesienia całej klasy do nowego pliku jak to pokazałeś się nie kompiluje a nie chce komplikować sprawy jeszcze bardziej
    Ostatnio zmieniony przez Pumpkin : 26-03-2014, 06:36

  9. #8
    Avatar Lux
    Data rejestracji
    2008
    Położenie
    Poznań
    Wiek
    30
    Posty
    133
    Siła reputacji
    17

    Domyślny

    Z tego co się orientuje to kompilator nie kompiluje plików z rozszerzeniem .h , służą one tylko żeby zostać przeklejone do kodu źródłowego. Więc wydaje mi się, że zostawienie wszystkiego w Circle.h i po prostu dołączenie tego pliku do pliku głównego może nie zadziałać.

    Mówisz, że jak przenosisz wszystko tak jak rozpisałem ci się nie kompiluje? Zobacz czy dołączyłeś wszystkie biblioteki, które wykorzystujesz (np. ja w osoba.h dodałem #include <string> ponieważ wykorzystałem stringi jako parametry dwóch metod, natomiast w osoba.cpp już biblioteki stringów dołączać nie musiałem bo znajduje się ona w pliku osoba.h, który bezpośrednio dołączyłęm do osoba.cpp, ale za to musiałem dołączyć już <iostream> i std ponieważ korzystam z strumienia wyjściowego [cout]).

    Nie wiem czy robisz to za pomocą projektu(projekt jako console application). Bo jeśli po prostu na sucho sobie tworzyłeś te trzy pliki i próbujesz odpalić main.cpp to ci będzie kompilator krzyczał gdyż nie widzi on tych trzech plików jako całość. Jeżeli utworzyłeś projekt to też nie odpalasz z osobna tych plików tylko sam plik projektu w moim przypadku Projekt.dev (rozszerzenie zależne od środowiska), wtedy otwiera ci się twój edytor i masz te pliki otworzone (wygląda to prawie identycznie jakbyś sobie osobno włączył je - ale działa), no i wiadomo odpalasz program.

    Musisz troche pokombinować, pewnie kompilator nie widzi tej struktury location, a odwołujesz się do niej w pliku Circle.h
    Ostatnio zmieniony przez Lux : 26-03-2014, 09:22

  10. #9

    Data rejestracji
    2007
    Położenie
    Warszawa, karton nr 4
    Posty
    54
    Siła reputacji
    18

    Domyślny

    @up
    bzdura. Słyszałeś o szablonach? Bibliotekach? Żadna biblioteka nie ma funkcji main() Po prostu kompilujesz "g++ plik.h" i robi się plik.o, który jest mniej więcej typu "GCC precompiled header (version 014) for C++" (oczywiście nie każdy będzie GCC).

    @OP
    a może powiesz nam, dlaczego kompilator się na to nie zgadza? Podrzucisz, jakie pliki Ci się udało zrobić?
    Quixo napisał:
    Więc w naszym kraju naprawde są bezmózgi mózyczne?

  11. #10
    konto usunięte

    Domyślny

    @up
    Szablony sa kompilowane przez kompilator. Ponadto, main() to jeden z przykladow entry point, wiec tu tez sie mylisz - biblioteki moga miec/maja entry point. Wracajac do szablonow, (zanim zapytasz dlaczego musza byc one w .h), to dlatego ze kompiler generuje nową klase (bazujac na headerze).

  12. #11
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    podzieliłem to na te 3 pliki i od razu definicję metod zrobiłem poza klasą

    main.cpp
    Kod:
    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    #include "Circle.h"
    
    using namespace std;
    
    struct location {
    float x;
    float y;
    };
    
    
    
    int main()
    {
        double m=6.,n=2,b=3;
        location w;
        w.x=2.;
        w.y=4.;
    
    
        Circle circle;
        circle.set_location((location){ 10., 12. });
        circle.set_radius(15.);
        Circle two(w,6.);
    
        Circle three = circle + two;
        Circle four = circle * m;
        Circle five = circle*n;
        Circle six = three + two;
    
        cout << three.get_location().x<<endl;
        cout << three.get_location().y<<endl;
        cout << three.get_radius()<<endl;
        cout <<endl;
        cout << four.get_location().x<<endl;
        cout << four.get_location().y<<endl;
        cout << four.get_radius()<<endl;
        cout <<endl;
        cout << five.get_location().x<<endl;
        cout << five.get_location().y<<endl;
        cout << five.get_radius()<<endl;
        cout <<endl;
        cout << six.get_location().x<<endl;
        cout << six.get_location().y<<endl;
        cout << six.get_radius()<<endl;
        cout <<endl;
        cout <<"Liczba istniejacych obiektow wynosi: " <<Circle::method();
        cout <<endl;
        return 0;
    }
    Circle.h
    Kod:
    #ifndef CIRCLE_H
    #define CIRCLE_H
    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    
    class Circle
    {
    
    
        private:
            struct location location;
            float radius;
    
    
        public:
        static int counter;
    
        static int method()
        {
        return counter;
        }
    
    
    
        Circle();
    
        Circle(struct location tm, float rad);
    
       ~Circle();
    
    
        void set_location(struct location temp);
    
        void set_radius(float promien);
    
        float get_radius();
    
        float area();
    
        float circumference();
    
    
        Circle operator+(Circle & r);
    
    
        Circle operator*( double & t);
    };
    
    #endif
    oraz circle.cpp

    Kod:
    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    #include "Circle.h"
    using namespace std;
    
    
    
    Circle::Circle()
        {
            location.x = 0;
            location.y = 0;
            radius = 0;
            counter++;
        }
    
    Circle::(struct location tm, float rad)
        {
            location = tm;
            radius = rad;
            counter++;
        }
    
    Circle::~Circle()
        {
           counter--;
        }
    
    void Circle::set_location(struct location temp)
        {
            location = temp;
        }
    
    void Circle::set_radius(float promien)
        {
            radius = promien;
        }
    
    float Circle::get_radius()
        {
            return radius;
        }
    
    float Circle::area()
        {
            return M_PI * pow(radius,2);
        }
    float Circle::circumference()
        {
            return 2 * M_PI * radius;
        }
    Circle Circle::operator+(Circle & r)
        {
        struct location u;
        u.x = ((r.get_location().x) + (get_location().x))/2;
        u.y = ((r.get_location().y) + (get_location().y))/2;
        float u_radius = r.get_radius()+get_radius();
        Circle nowy(u,u_radius);
        return nowy;
        }
    
    Circle Circle::operator*( double & t)
        {
        struct location u;
        u.x = get_location().x;
        u.y = get_location().y;
        float u_radius = get_radius()*t;
        Circle nowy(u,u_radius);
        return nowy;
        }
    
    
    int Circle::counter = 0;

    pojawia się błąd kompilacji C:\Users\xxx\Documents\CodeBlocks\zad\Circle.h|12| error: field 'location' has incomplete type

    12 linijka czyli
    struct location location;
    Ostatnio zmieniony przez Pumpkin : 26-03-2014, 12:32

  13. #12
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    a gdzie masz zdefiniowaną strukturę location? ja nie widzę
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  14. #13
    Avatar Bazan
    Data rejestracji
    2008
    Wiek
    31
    Posty
    1,909
    Siła reputacji
    18

    Domyślny

    To przez to, że w klasie używasz struktury która jest zadeklarowana dopiero po wczytaniu pliku klasy.

    Przenieś deklarację struktury do innego pliku nagłówkowego, i go wczytaj w mainie i class.h
    Dreaming by drumming. ˆˆ™

  15. #14
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    Cytuj Bazan napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    To przez to, że w klasie używasz struktury która jest zadeklarowana dopiero po wczytaniu pliku klasy.

    Przenieś deklarację struktury do innego pliku nagłówkowego, i go wczytaj w mainie i class.h
    Musisz troche pokombinować, pewnie kompilator nie widzi tej struktury location, a odwołujesz się do niej w pliku Circle.h
    thx, to w końcu pomogło i się już kompiluje ;p


    wielkie dzięki wszystkim za pomoc i zaangażowanie
    Ostatnio zmieniony przez Pumpkin : 26-03-2014, 14:03

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Podział szybkosci internetu-pomoc.
    Przez Chels w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 0
    Ostatni post: 29-10-2014, 21:38
  2. Potrzebna pilna pomoc (Keylogger)
    Przez Forgesse&Savernious w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 1
    Ostatni post: 29-12-2011, 04:53
  3. Pilna pomoc ! strony
    Przez Bombardier w dziale Tibia
    Odpowiedzi: 3
    Ostatni post: 23-03-2011, 15:55
  4. Whisper Beer- pilna pomoc
    Przez Ogarniam w dziale Tibia
    Odpowiedzi: 1
    Ostatni post: 07-11-2010, 19:04
  5. Problem Z Wizzard Addonem 2 ! Pilna Pomoc
    Przez az'zet w dziale Tibia
    Odpowiedzi: 1
    Ostatni post: 28-08-2010, 20:36

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •