Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] problem z new (delete) oraz klasą

Ostatnio zmodyfikowano 2010-09-22 17:29
Autor Wiadomość
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:
C/C++
//plik.h:

#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


//main.cpp:

#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)?
P-22228
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:
C/C++
#include <conio.h>
#include <iostream>
#include <string>

class Klasa {
   
public:
    void Text( const string & Tekscik ) //bynajmniej twój argument trochę ssie, więc zastąpiłem czymś Bardziej normalnym
    {
        cout << tekscik << endl;
    }
};





using namespace std;

int main()
{
    Klasa * Klasowe = new Klasa;
    Klasowe->Text( "tekst" );
    cin.get(); //lepsze to niż getch(), jeżeli chcesz użyć więcej razy, po każdym użyciu wklep cin.sync();
    delete Klasowe;
    return 0;
}
P-22229
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
C/C++
#ifndef plikh
#define plikh

extern int zmienna1 = 5;

#endif

plik.cpp
C/C++
#include "plik.h"

int zmienna1;

main.cpp
C/C++
#include <iostream>
#include <conio.h>
#include "plik.h"

int main()
{
    std::cout << zmienna1;
    getch();
}
P-22231
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.
P-22232
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"... ?
P-22234
szyx_yankez
» 2010-09-21 21:03:52
@ThudPoland
C/C++
class Klasa {
   
public:
    void Text( const string & Tekscik ) //Po kiego tu referencija? Przecierz on chce tylko przekazać tekst do strumienia wyjściowego, nie wykonuje żadnych operacij modyfikujących, tą zmieną(stałą w twoim przypadku), więc i tak referencija nic tu nie działa.
    {
        cout << tekscik << endl;
    }
};
P-22235
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ść.
P-22236
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.
P-22239
« 1 » 2
  Strona 1 z 2 Następna strona