|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
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
|
Wysł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 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
|
Wysł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 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
|
Wysłany: Śro 3:35, 17 Sty 2007 Temat postu: |
|
|
Dzieki Pawel, juz wszystko jasne :)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
jagm
zielony żul
Dołączył: 01 Lut 2006
Posty: 1421
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
jagm
zielony żul
Dołączył: 01 Lut 2006
Posty: 1421
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysłany: Śro 16:48, 17 Sty 2007 Temat postu: |
|
|
Dokladnie, nie ma to jak Scheme ;P
|
|
Powrót do góry |
|
|
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
|
Wysłany: Śro 16:50, 17 Sty 2007 Temat postu: |
|
|
@Jagm: żeby poszło tak, jak masz rozpisane, to w main.cpp zmień na Wtedy powinno przejść ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
jagm
zielony żul
Dołączył: 01 Lut 2006
Posty: 1421
Przeczytał: 0 tematów
|
Wysłany: Śro 17:05, 17 Sty 2007 Temat postu: |
|
|
Skrobocik napisał: | @Jagm: żeby poszło tak, jak masz rozpisane, to w main.cpp zmień na 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 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
|
Wysł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 poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cheater_
Orajt:)
Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów
|
Wysł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 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
|
Wysłany: Czw 0:59, 18 Sty 2007 Temat postu: |
|
|
@exeman - poprawne wyjaśnienie.
|
|
Powrót do góry |
|
|
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
|
Wysł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 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
|
Wysł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ń na 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 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
|
Wysł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 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
|
Wysł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 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
|
Wysł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 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
|
Wysł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 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?
|
Wysł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 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 :]
|
Wysłany: Pią 18:23, 19 Sty 2007 Temat postu: |
|
|
Tak, tak.
|
|
Powrót do góry |
|
|
|
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
|