Προς το περιεχόμενο

Πως δημιουργουμε μια κλαση στη VC++ ;


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας και χαρα σας, λοιπων.... αρχησα C++ (και καλα τωρα). Εκει που ειναι ολλλα μελι γαλα , τσουπ πεταχτηκε το ερρορ ..

 

Η ερωτηση μου ειναι πως δημιουργουμε ενα instane μιας κλασσης?

πχ εχουμε int a=0; μια χαρα !! αν εχουμε class c? c=? :rolleyes:

 

 

 

error

>C:\Documents and Settings\admin\test2.cpp(7) : error C2065: 'Application' : undeclared identifier
C:\Documents and Settings\admin\test2.cpp(7) : error C2146: syntax error : missing ';' before identifier 'app'
C:\Documents and Settings\admin\test2.cpp(7) : error C2065: 'app' : undeclared identifier

>#include <stdio.h>
#include <string>
using namespace std;

int main (int args,char line[])
{  
Application app;//εδω μου πεταει το ερρορ


return 0;
}

class Application
{
public:
Application();
void Run();
string Name;
private:
void SayHello();
bool CheckName();
};
void Application::Run()
{
SayHello();
}
void Application::SayHello()
{
if(CheckName())
	printf("Hello!!! %s",Name);

}
bool Application::CheckName()
{
return Name != "" ;
}

 

Δημοσ.

βάλε το main κάτω από το definiton της κλάσης σου. (δεν την βλέπει έτσι)

 

Επίσης είμαι σχεδόν σίγουρος πως εκτός αν κάνεις overload δεν μπορείς να κάνεις compare strings με αυτό το operator.

 

Και μην χρησιμοποιείς το stdio έτσι.

Δημοσ.

Ααααααα... καταλαβα... η mian πρεπει να ειναι πρωτη συναρτηση.

Νομιζα οτι ο cοmpiler ψαχνει για τη main οπου και αν ειναι. Ok θα βαλω τη κλασση σε h + cpp file , και θα τη κανω include . (θα το δοκιμσω αυριο )

Κατι αλλο, πως οριζω μια κλασση? aclass obj;? aclass obj =new aclass();? aclass obj=gcnew aclass();?

 

Yγ:Visual studio 6

Δημοσ.

οχι, η main δεν χρειαζεται να ειναι 1η συναρτηση

αυτο που χρειαζεται ειναι οταν πας οπουδηποτε να χρησιμοποιησεις κατι, αυτο το 'κατι' πρεπει να εχει οριστει πιο πριν

στο δικο σου κωδικα πηγες να χρησιμοποιησεις την Application χωρις να εχει οριστει πιο πριν (την ορισες μετα)

ειναι ενα απο τα πραγματα που θελουν συνηθεια στη C\C++ :-)

Δημοσ.

Για να είμαστε ακριβείς, δεν πρέπει να όριστεί ποιό πρίν, πρέπει να δηλωθεί ποιό πρίν. Για να φτιάξεις δυναμικά κλάσεις θα πρέπει να μάθεις pointers.

 

Από κεί και πέρα μου φαίνεται περίεργο που μιλάς συγκεκριμένα για "Visual Studio C++". Τέλος πάντων θα σου πρότεινα να διαβάσεις ενα C++ manual για να έχεις ιδέα του τι γράφεις (μιας και πίστεψέ με, δεν έχεις) καθαρά λόγου του αν κάνεις skip τα basics τώρα, θα χάσεις πολύ χρόνο αργότερα.

Δημοσ.
Για να είμαστε ακριβείς, δεν πρέπει να όριστεί ποιό πρίν, πρέπει να δηλωθεί ποιό πρίν. Για να φτιάξεις δυναμικά κλάσεις θα πρέπει να μάθεις pointers.

κατσε, οταν λεμε δηλωση εννουμε declaration και οταν λεμε ορισμο εννουμε definition, σωστα?

τοτε για να ειμαστε ακομα πιο ακριβεις, πρεπει να εχει οριστει πριν δηλωθει, και να εχει δηλωθει πριν χρησιμοποιηθει :-)

Δημοσ.

καλα καλα ... επρεπε απο την αρχη να αναφερθω με αγγλικη ορολογια γιατι στα ελληνικα... απλα δεν υπαρχει...

 

Τωρα κολλησα αλου.. Εστω οτι εχουμε δυο class, και οι δυο κανουν το ιδιο πραμα , σε αυτη τη περιπτωση διαβαζουν κατι.

 

Αρα εχουμε class SomethingReader, και class SomethingElseReader , και οι δυο readers επιστρεφουν SomeType .

Τελος εχουμε μια συναρτηση η οποια θελει να διαβασει SomeType απο Something ή SomethingElse. Εδω θελω μια "Interface"(like object oriented langauge) class IReader η οποια να δεχετε και τοις δυο class (SomethingReader,SomethingElseReader) και να καλει τη συναρτηση η οποια επιστρεφει SomeType.

Χωρης να χρησιμοποιησω Base class

κατι τετιο

>
....
......
IReader *reader;
switch(value)
{
case something:
reader= new SomethngReader(...);
...
case somthingelse:
reader = new SomethingElseReader(...);
...
}
....
SomeType some=reader.Read();
...

 

---------- Το μήνυμα προστέθηκε στις 18:55 ----------

 

Μπορει να μου κανεις τι λαθος κανω εδω?

>template <class T>
class MemoryStream{
public:
T* buffer;
long Size;
void Write(T* buffer_,long bufferSize)
{
	Size = bufferSize;
	AllocBuffer();
	buffer =buffer_;
}
T* Read(long index,long count)
{
	T temp[count];
	long tempIndex=0;
	for(;index<(index+count);index++,tempIndex++)
		temp[tempIndex]=buffer[index];
	return temp;
}
void Clean(void)
{
	free(buffer);
}
private:
void AllocBuffer(void)
{
	buffer = (T*) malloc(sizeof(T*)*Size);
}
};
int _tmain(int argc, _TCHAR* argv[])
{

char somestream[]="lalalala";
MemoryStream<char> *ms;
ms->Write(somestream,sizeof(somestream));
printf("%s",ms->Read(1,4));
return 0;
}

Δημοσ.

με μια γρηγορη ματια

 

>
int _tmain(int argc, _TCHAR* argv[])
{

   char somestream[]="lalalala";
   [color=Red]// MemoryStream<char> *ms;[/color]
      MemoryStream<char> ms; //βγαλε το *

      [color=Red]// ms->Write(somestream,sizeof(somestream));[/color]
   ms.Write(somestream,sizeof(somestream)); // . αντι για ->
   
       [color=Red]// printf("%s",ms->Read(1,4));[/color]
       printf("%s",ms.Read(1,4));    // . αντι για ->
   return 0;
}

Δημοσ.

Χμμμ.. Τιποτα...

Αυτα ειναι τα παραπονα του compiler

 

1>Compiling...

1>mol.cpp

1>c:\users\admin\documents\visual studio 2008\projects\mol\mol\mol.cpp(18) : error C2057: expected constant expression

1> c:\users\admin\documents\visual studio 2008\projects\mol\mol\mol.cpp(17) : while compiling class template member function 'char *MemoryStream<T>::Read(long,long)'

1> with

1> [

1> T=char

1> ]

1> c:\users\admin\documents\visual studio 2008\projects\mol\mol\mol.cpp(38) : see reference to class template instantiation 'MemoryStream<T>' being compiled

1> with

1> [

1> T=char

1> ]

1>c:\users\admin\documents\visual studio 2008\projects\mol\mol\mol.cpp(18) : error C2466: cannot allocate an array of constant size 0

1>c:\users\admin\documents\visual studio 2008\projects\mol\mol\mol.cpp(18) : error C2133: 'temp' : unknown size

1>c:\users\admin\documents\visual studio 2008\projects\mol\mol\mol.cpp(22) : warning C4172: returning address of local variable or temporary

 

Δημοσ.

ok, 2 λαθη

 

το πρωτο

>
T* Read(long index,long count)
{
   T temp[count];
   long tempIndex=0;
   for(;index<(index+count);index++,tempIndex++)
       temp[tempIndex]=buffer[index];
   return temp;
}

σε αντιθεση με το .NET, στη C++ δεν μπορεις να επιστρεψεις εναν πινακα σαν

αποτελεσμα με αυτο τον τροπο. Πρεπει ο πινακας να εχει δηλωθει πιο πριν απο αυτον που καλει την Read και να της τον δινει σαν ορισμα. (ακολουθει ολοκληρωμενο πχ)

 

2ο λαθος, η συνθηκη του for.

δεν ξερω τι πας να κανεις αλλα το

index<(index+count) ειναι παντα true, αρα το for σου δεν θα τελειωνε ποτε

αν αυτο που θελεις να κανεις ειναι να αντιγραψεις στον temp count στοιχεια του buffer ξεκινωντας απο το index-οστο στοιχειο του, τοτε μπορεις να πετυχεις αυτο

 

που θες ειτε ετσι

>
long tempIndex=0;
while(tempIndex<index+count)
{
       temp[tempIndex] = buffer[index+tempIndex];
   tempIndex++; 
}

ειτε ακομα πιο απλα

>
memcpy( temp, buffer+index, count);

τωρα, η σωστη(?) Read και η αντιστοιχη χρηση της στη μαιν θα ηταν

>
...
void Read(long index,long count, T* result_buffer)
{
    long tempIndex=0;
        
   while (tempIndex < index+count)
   {
       result_buffer[tempIndex] = buffer[index+tempIndex];
       tempIndex++;
   }
}
....

main()
{
   char somestream[]="lalalala";
   char result[10] = {0};   // will hold the result
    
   //MemoryStream<char> *ms;
   MemoryStream<char> ms;
   //ms->Write(somestream,sizeof(somestream));
   ms.Write(somestream,sizeof(somestream));
   
   //printf("%s",ms.Read(1,4));
   ms.Read(0,4,result); //read the buffer first
   printf("%s\n",result); //then print it
   return 0;

}

Δημοσ.

Εισαι θεος !!!

τωρα δουλευει ρολοϊ :-D

>
[color="Silver"]
#include "stdafx.h"
template <class T>
class MemoryStream{
public:
long Size;
void Write(T* buffer_,long bufferSize)
{
	Size = bufferSize;
	AllocBuffer();
	buffer =buffer_;
}[/color]
   void Read(long index,long count,T* buffer_)
{
	long step=0;
	while(step<count)
	{
		buffer_[step]=buffer[index+step];
		step++;
	}
}
[color="silver"]void Clean(void)
{
	free(buffer);
}
private:
void AllocBuffer(void)
{
	buffer = (T*) malloc(sizeof(T*)*Size);
}
T* buffer;
};
int _tmain(int argc, _TCHAR* argv[])
{
char c[]="1234567890";
int i[] = {1,2,3,4,5,6,7,8,9,0};

MemoryStream<int> ms;
MemoryStream<char> ms1;

ms.Write(i,10);//int
ms1.Write(c,10);//char

int res_i[4];
char res_c[4];

ms.Read(3,4,res_i);//int
ms1.Read(3,4,res_c);//char

for(int u=0;u<4;u++)
printf("%d  %c\n",res_i[u],res_c[u]);
printf("%d",sizeof(res_c));
getchar();
return 0;
}[/color]

Το εχω ετσι γιατι θελω να διαβαζω συγκεκριμενα block απο BYTE και bool

Δημοσ.

Μπα, δε μου κανει. Αυτη τεμπλεϊτ εχει και αλλα πραματα, ο κωδιακα πανω ειναι για τεσταρισμα για αυτο και ειναι σε console mode.

Δημοσ.

οκ,

 

παντως αυτο

>
void Read(long index,long count,T* buffer_)
{
   long step=0;
   while(step<count)
   {
       buffer_[step]=buffer[index+step];
       step++;
   }
}

ειναι πανομοιοτυπο σε λειτουργικοτητα με αυτο

>
void Read(long index,long count,T* buffer_)
{
    memcpy( buffer_, buffer+index, count);     
}

το δευτερο ειναι γρηγοροτερο προφανως......

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...