Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Pytania odnosnie C++

 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Programowanie
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
exeman
Mistrz grilla



Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów

Skąd: znienacka

PostWysłany: Śro 2:34, 17 Sty 2007    Temat postu: Pytania odnosnie C++

Jak najprosciej "odziedziczyc" konstruktor i destruktor w klasie nadrzednej? Z tego co pamietam w C++ nie dziedzicza sie one automagicznie. Do kostruktora uzywam konstrukcji class A: public B{ public A(cos)::B(cos){}; }

Pozdro 600 ;]

I jak zrobic takie wywolanie konstruktora klasy nadrzednej jak konstruktor tej wlasnie ma taka definicje

class cOurSet<T>::IteratorPre:public cOurSet<T>::Iterator ?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Pawel Str.
pijak



Dołączył: 06 Lut 2006
Posty: 429
Przeczytał: 0 tematów

Skąd: Ze starszego roku / Z Gorlic

PostWysłany: Śro 3:21, 17 Sty 2007    Temat postu:

Kod:
#include <iostream>

template<typename T> class cOurSet{

public:
    class Iterator {
   public:
       Iterator(int i) {
      std::cout << i << std::endl;
       }
    };
   
    class IteratorPre : public Iterator {
   public:
       IteratorPre(int i): Iterator(i) {}
    };
};



int main() {
    cOurSet<int>::IteratorPre it = cOurSet<int>::IteratorPre(77);
    return 0;
}


A jeżeli nie chcemy definiować inline, to można tak:

Kod:

#include <iostream>

template<typename T> class cOurSet {
public:
       class Iterator;
       class IteratorPre;
};

template<typename T>
class cOurSet<T>::Iterator
{
   public:
   Iterator(int i) {
      std::cout << i << std::endl;
   }
};


template<typename T>
class cOurSet<T>::IteratorPre : public cOurSet<T>::Iterator
{
   public:
   IteratorPre(int i) : cOurSet<T>::Iterator(i) {
   }
};



int main() {
    cOurSet<int>::IteratorPre it = cOurSet<int>::IteratorPre(77);


    return 0;
}


I nawet typename nie trzeba :-)

(error: keyword ‘typename’ not allowed in this context (the base class is implicitly a type))
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
exeman
Mistrz grilla



Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów

Skąd: znienacka

PostWysłany: Śro 3:35, 17 Sty 2007    Temat postu:

Dzieki Pawel, juz wszystko jasne :)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
jagm
zielony żul



Dołączył: 01 Lut 2006
Posty: 1421
Przeczytał: 0 tematów


PostWysłany: Śro 15:47, 17 Sty 2007    Temat postu:

Jak się robi konstruktory przy szablonach klas?

Mam coś takiego:

test.h:
Kod:

#ifndef _TEST_H_
#define _TEST_H_

template <class T>
class CTest {
    public:
        CTest();
};

#endif


test.cpp:
Kod:

#include "test.h"

    template <class T>
    CTest<T>::CTest() {
    }


main.cpp:
Kod:

#include "test.h"

int main(int argc, char *argv[]) {

    CTest<int> a;

}


i dostaję
Kod:
[Linker error] undefined reference to `CTest<int>::CTest()'


A jak dodam w mainie include'a "test.cpp", to wszystko działa normalnie.
Moge ewentualnie tak zrobić, ale może ktoś mi wytłumaczy, dlaczego tak jak mam teraz nie działa?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
exeman
Mistrz grilla



Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów

Skąd: znienacka

PostWysłany: Śro 15:56, 17 Sty 2007    Temat postu:

Z tego co slyszalem to definicja i implementacja calego szablonu musi byc w jednym pliku.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
jagm
zielony żul



Dołączył: 01 Lut 2006
Posty: 1421
Przeczytał: 0 tematów


PostWysłany: Śro 16:20, 17 Sty 2007    Temat postu:

kutwa. to na... po co są w ogóle pliki nagłówkowe. z dupy jest ten język
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
exeman
Mistrz grilla



Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów

Skąd: znienacka

PostWysłany: Śro 16:48, 17 Sty 2007    Temat postu:

Dokladnie, nie ma to jak Scheme ;P
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Śro 16:50, 17 Sty 2007    Temat postu:

@Jagm: żeby poszło tak, jak masz rozpisane, to w main.cpp zmień
Kod:
#include "test.h"
na
Kod:
#include "test.cpp"
Wtedy powinno przejść ;)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
jagm
zielony żul



Dołączył: 01 Lut 2006
Posty: 1421
Przeczytał: 0 tematów


PostWysłany: Śro 17:05, 17 Sty 2007    Temat postu:

Skrobocik napisał:
@Jagm: żeby poszło tak, jak masz rozpisane, to w main.cpp zmień
Kod:
#include "test.h"
na
Kod:
#include "test.cpp"
Wtedy powinno przejść ;)


jagm napisał:
A jak dodam w mainie include'a "test.cpp", to wszystko działa normalnie.


tak też robię, żeby działało ;] ale mimo wszystko jak się mnie zapyta dr Gorazd dlaczego tam jest cpp a nie h, to chciałbym udzielić jakiejś innej odpowiedzi niż 'bo ten język jest z dupy', więc stąd moje pytanie
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
exeman
Mistrz grilla



Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów

Skąd: znienacka

PostWysłany: Śro 17:06, 17 Sty 2007    Temat postu:

No bo chodzi o to, ze kompilator osobno magluje headersy osobno .cpp'y, a potem dopiero to "laczy" podczas linkowania, a template jest to taki jaka rozbudowana makrodefinicja, wiec przed kompilacja juz powinna byc uzupelniona o konkretny typ. Ale to mi sie tak wydaje, nie wiem jak jest naprawde ;)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cheater_
Orajt:)



Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów


PostWysłany: Śro 18:02, 17 Sty 2007    Temat postu:

Szablony można mieć w kilku plikach, z tym że w programie includować trzeba .cpp :P A w .cpp mieć zaincludowany .h
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Pawel Str.
pijak



Dołączył: 06 Lut 2006
Posty: 429
Przeczytał: 0 tematów

Skąd: Ze starszego roku / Z Gorlic

PostWysłany: Czw 0:59, 18 Sty 2007    Temat postu:

@exeman - poprawne wyjaśnienie.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mateo
pijak



Dołączył: 08 Mar 2006
Posty: 296
Przeczytał: 0 tematów

Skąd: Krk - Biały Prądnik

PostWysłany: Czw 1:52, 18 Sty 2007    Temat postu:

@jagm:

przy szablonach najczesciej stosuje sie 2 rozwiazania:

1) jesli klasa szablonowa ma funkcjonowac dla zupelnie dowolnych typow (przykladowo stack, czy vector z stl) to nie pozostaje nic innego jak wszystkie definicje funkcji skladowych umiescic w pliku *.h (wzglednie w pliku *.cpp - w kazdym razie musi to byc jeden plik). Dlatego tez kazdy moze sobei przegladac pelne kody kolekcji z stla

2) jesli klasa szablonowa ma miec mozliwosc konkretyzacji tylko dla okreslonych typow i nie chcesz zeby kazdy programista mial pelny dostep do calego kodu twojego szablonu to wtedy sie robi tak ze plik *.h wyglada tak jak przy zwyklych klasach, w pliku *.hpp sie umieszcza kod tego co normlanie sie umieszcza w *.cpp, a w *.cpp umieszcza sie konkretyzacje szablonu dla konkretnych typow.

BTW: a tak pozatym to co z naszymi projektami z P2? kiedy mamy ostateczny termin?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Pią 0:03, 19 Sty 2007    Temat postu:

jagm napisał:
Skrobocik napisał:
@Jagm: żeby poszło tak, jak masz rozpisane, to w main.cpp zmień
Kod:
#include "test.h"
na
Kod:
#include "test.cpp"
Wtedy powinno przejść ;)


jagm napisał:
A jak dodam w mainie include'a "test.cpp", to wszystko działa normalnie.


tak też robię, żeby działało ;] ale mimo wszystko jak się mnie zapyta dr Gorazd dlaczego tam jest cpp a nie h, to chciałbym udzielić jakiejś innej odpowiedzi niż 'bo ten język jest z dupy', więc stąd moje pytanie


Kurde, dzisiaj byłem u Krawczyka odnośnie jednego z zadań domowych z programowania no i dopiero jazda była :?
U mnie w DevCpp kompilowało się bezproblemowo, natomiast u Krawczyka w gabinecie wyskakiwały błędy, że niby rzeczy są kilka razy definiowane :? On też miał Dev'a więc pytam się o co chodzi :?:
Ja u siebie miałem w głównym pliku poinclude'owane pliki .cpp i chodziło dobrze, natomiast po kombinowaniu z Krawczykiem zrobiliśmy tak, że do plików z klasami .h, natomiast do pliku z szablonami .cpp. No i teraz weź człowieku się połap, co zainkludować, żeby projekt główny z powodów problemów z kompilacją nie został jakoś źle zaliczony (kompiluję u siebie na -Wall czyli wyświetla wszystkie warningi - u mnie szło na czysto) :?:

Od razu pytanie - jesli zainkluduję i pliki .h i .cpp naraz, to czy będzie błąd :?:
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
oinopion
żul



Dołączył: 28 Lis 2005
Posty: 858
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Pią 0:15, 19 Sty 2007    Temat postu:

@Skrobot: #include to po prostu żywcem wstawienie kodu w danej linijce. Możesz sobie włączyać pliki jakie chcesz, byleby tylko nie włączyć do pliku a.h pliku b.h, który włącza plik a.h, który... Ale przed tym zabezpieczamy się #ifndef'ami.

Odpowiadając na Twoje pytanie: to zależy, co w nich masz.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Pią 0:33, 19 Sty 2007    Temat postu:

Mam zabezpieczenie #ifndef'ami ;)
W pliku .h mam sama nazwe klasy i zadeklarowane skladowe, metody i operatory, natomiast w .cpp mam implementacje metod, konstruktorow i operatorow zapodanych w .h - czyli chyba tak jak powinno być ;)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stasiu
zielony żul



Dołączył: 16 Lis 2005
Posty: 920
Przeczytał: 0 tematów

Skąd: krk

PostWysłany: Pią 1:52, 19 Sty 2007    Temat postu:

podlacze sie pod temat:
czy metody typu vector::push_back czy map::insert wstawiaja dany element do struktury, czy tworza jego kopie?

EDIT: ok, wiem to bylo glupie pytanie. Znow napisalem zanim pomyslalem :|
EDIT2: wlasciwie to teraz sam nie wiem o co mi chodzilo... :? za malo snu, za duzo c++... ide spac


Ostatnio zmieniony przez Stasiu dnia Pią 2:07, 19 Sty 2007, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
oinopion
żul



Dołączył: 28 Lis 2005
Posty: 858
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Pią 2:06, 19 Sty 2007    Temat postu:

Stasiu napisał:
podlacze sie pod temat:
czy metody typu vector::push_back czy map::insert wstawiaja dany element do struktury, czy tworza jego kopie?


Kod:
#include <iostream>
#include <vector>

using namespace std;

int main ()
{
   vector<int> v;
   int* i = new int(5);
   v.push_back(*i);
   delete i;
   cout << v.size() << " - " << v.front() << endl;
}


Taki szybki test pozwala powiedzieć, że robi to to kopię, tak jak można się było spodziewać [nie chcesz kopii - zrób wektor wskaźników, będzie chudszy pamięciowo].

* Test u mnie się nie wywalił, więc jest to dowód przez [jeden] przykład.

[merge]

Skrobocik napisał:
Mam zabezpieczenie #ifndef'ami ;)
W pliku .h mam sama nazwe klasy i zadeklarowane skladowe, metody i operatory, natomiast w .cpp mam implementacje metod, konstruktorow i operatorow zapodanych w .h - czyli chyba tak jak powinno być ;)


Z template'ami to jest tak, że najlepiej je wrzucić do jednego pliku, najlepiej jeszcze "inline", tzn przy deklaracji od razu podawać definicję.

Skrobot, musisz sobie przemyśleć, czy nie definiujesz czegoś 2 razy. Deklarować możesz ile wlezie, deklaracja nie powoduje wygenerowania kudu. Definicja już tak. Tak ogólnie to z zależności powinien Ci wyjść DAG ;]
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kg86
zielony żul



Dołączył: 22 Gru 2005
Posty: 1194
Przeczytał: 0 tematów

Skąd: pochodze?

PostWysłany: Pią 17:55, 19 Sty 2007    Temat postu:

mam wektor(v) wskaznikow do obiektow klasy, powiedzmy z gory sobie ustalilem jego rozmiar, czy moge zrobic np. cos takiego:
v[0] = new nazwa_klasy(...)? :)
albo v.push_back(new nazwa_klasy(...))? :)
rzecz w tym, ze nie chce rezerwowac pamieci 'na zewnatrz' i dopiero wrzucac wskaznik do wektora, tylko od razu w wektorze :)
aha, i jeszcze jedno:
jesli w takim wektorze jest juz wskaznik na obiekt klasy z zarezerwowana pamiecia... to czy moge ot tak po prostu przypisac temu wskaznikowi jakis inny wskaznik?
np. gdzies tam w programie, w innej klasie mam publiczny wskaznik na jakis inny obiekt z zarezerwowana pamiecia(wsk), oraz poza ta klasa mam wektor, w ktorym jest wskaznik na ten sam typ obiektu(v[0])... czy moge zamienic wskazniki bez zbednych new i delete, np tak:
nazwa_klasy * tmp = v[0];
v[0] = wsk;
wsk = tmp;
? :)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Madras
Omylny Admin



Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów

Skąd: Z Pokoju :]

PostWysłany: Pią 18:23, 19 Sty 2007    Temat postu:

Tak, tak.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kg86
zielony żul



Dołączył: 22 Gru 2005
Posty: 1194
Przeczytał: 0 tematów

Skąd: pochodze?

PostWysłany: Pią 18:26, 19 Sty 2007    Temat postu:

zajebiscie :D
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Programowanie Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin