[C++] problem z new (delete) oraz klasą
Ostatnio zmodyfikowano 2010-09-22 17:29
SeaMonster131 Temat założony przez niniejszego użytkownika |
[C++] problem z new (delete) oraz klasą » 2010-09-21 20:24:06 Witam, przejdę od razu do rzeczy: mam 2 pliki - main.cpp oraz plik.hpp oraz kod w nich:
#ifndef plik_h #define plik_h
#include <conio.h> #include <iostream> #include <string>
using namespace std;
class Klasa { public: void Text( string tekscik ) { cout << tekscik << endl; } };
Klasa * klasowe = new Klasa;
#endif
#include <conio.h> #include <iostream> #include <string> #include "plik.h"
using namespace std;
int main() { klasowe->Text( "tekst" ); getch(); return 0; }
Czyli umieściłem w plik.h klasę Klasa, jest w niej funkcja Text(); i w main.cpp chcę tylko napisać coś w stylu "klasowe->Text("tekst");" tylko oczywiście wyświetla się error że "klasowe nie jest zadeklarowane w tym zakresie". Jak to można zmienić żeby wszystko chodziło ok (i dać te delete żeby nie było wycieku pamięci itd)? |
|
ThudPoland |
» 2010-09-21 20:39:58 Bynajmniej program skompilowany pod GCC się nie wywala (jasne, bo to GCC ;P), ale wrzuciłem kod do Maina: #include <conio.h> #include <iostream> #include <string>
class Klasa { public: void Text( const string & Tekscik ) { cout << tekscik << endl; } };
using namespace std;
int main() { Klasa * Klasowe = new Klasa; Klasowe->Text( "tekst" ); cin.get(); delete Klasowe; return 0; }
|
|
lenrokskate |
» 2010-09-21 20:41:34 po pierwsze jak deklarujesz zmienne/wskazniki w plikach nagłówkowych, to dopisz przed każdą deklaracją słowo kluczowe static lub weź je w pustego namespace'a po drugie powinno się używać extern do takich rzeczy: plik.h #ifndef plikh #define plikh
extern int zmienna1 = 5;
#endif
plik.cpp #include "plik.h"
int zmienna1;
main.cpp #include <iostream> #include <conio.h> #include "plik.h"
int main() { std::cout << zmienna1; getch(); }
|
|
ThudPoland |
» 2010-09-21 20:43:27 Ja jestem przeciwny robieniu zmiennych globalnych - przy odpowiednim skomplikowaniu kodu może zrobić to bałagan.
//Edit: No chyba że to stałe matematyczne i biblioteka. |
|
SeaMonster131 Temat założony przez niniejszego użytkownika |
» 2010-09-21 21:03:47 @ThudPoland - o to chodzi że chce mieć klase w plik.h a nie w main (jak jest w main to wszystko dobrze działa):P @lenrokskate - czyli jak dokładnie to zrobić? Dałem w nagłówku w pusty namespace i extern class Klasa; a w plik.cpp dałem class Klasa; ale wywala błąd że: "a storage class can only be specified for objects and functions"... ? |
|
szyx_yankez |
» 2010-09-21 21:03:52 @ThudPoland
class Klasa { public: void Text( const string & Tekscik ) { cout << tekscik << endl; } };
|
|
ThudPoland |
» 2010-09-21 21:07:19 Potwór: Ok, fakt, ale wiadomo o co chodzi, wystarczy zmienić tą zmienną na lokalną nie zaś globalną w nagłówku.
Szyx: Chodzi o wydajność. |
|
szyx_yankez |
» 2010-09-21 21:36:38 @lenrokskate
po drugie powinno się używać extern do takich rzeczy:
Tyle, żę do autora tematu, to się nie tyczy.
@ThudPoland
Rzeczywiście wydajnośc może i lepsza, ale minimalnie.
Zrobiłem mały teścik: wywołałem tymi dwoma sposobami milion razy te dwie funkcije i co się okazało?
text(string tekscik) czas wykonywania - 47750 milisekund,
text(const string &tekscik) czas wykonywania - 47350 milisekund.
Dodam, żę wyniki są średnią kilku pomiarów.
Wniosek jest prosty, uzyskujemy niecały 1% przyspieszenia, ale dobre i to. |
|
« 1 » 2 |