problem on work with Class CArray [modified]
-
:D i create the CArray in parent function as CArray FArray; how i have to pass it in the parametr of function ? :D
Immunity18 wrote:
i create the CArray in parent function as CArray FArray;
Did you leave out the angle brackets on purpose or by accident. That should be CArray < CString , CString& > FArray;
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
-
Immunity18 wrote:
i create the CArray in parent function as CArray FArray;
Did you leave out the angle brackets on purpose or by accident. That should be CArray < CString , CString& > FArray;
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
CArray < CString , CString > FArray; so i have to go and correct it the second CString ==> CString& or can I work with that style ?
-
CArray < CString , CString > FArray; so i have to go and correct it the second CString ==> CString& or can I work with that style ?
Immunity18 wrote:
and correct it the second CString ==> CString&
Yes. It needs to be the same everywhere you use the template definition. That's why a typedef can simplify things. A typedef creates an alias to the type: typedef CArray< CString , CString &> CMyStringArray; Now you can use "CMyStringArray" instead of "CArray< CString , CString &>" everywhere...
typedef CArray< CString , CString &> CMyStringArray;
...
double CAnaktisiDlg::FindDF(CString file , CMyStringArray &AFArray)
...
void CAnaktisiDlg::GetDF(CMyStringArray &FArray)
...
CMyStringArray FArray;
...
// Call a method/function passing FArray by reference
double retval = FindDF(filestr , FArray);Makes it cleaner to read IMO but you're free to use the long version of course :) Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
-
Immunity18 wrote:
and correct it the second CString ==> CString&
Yes. It needs to be the same everywhere you use the template definition. That's why a typedef can simplify things. A typedef creates an alias to the type: typedef CArray< CString , CString &> CMyStringArray; Now you can use "CMyStringArray" instead of "CArray< CString , CString &>" everywhere...
typedef CArray< CString , CString &> CMyStringArray;
...
double CAnaktisiDlg::FindDF(CString file , CMyStringArray &AFArray)
...
void CAnaktisiDlg::GetDF(CMyStringArray &FArray)
...
CMyStringArray FArray;
...
// Call a method/function passing FArray by reference
double retval = FindDF(filestr , FArray);Makes it cleaner to read IMO but you're free to use the long version of course :) Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
ok i try to do as you command !:D but where i will put typedef ? in .h ? (for the moment i put it in .cpp ) and i will put it where the #includes or where the are the other declarations
-
Immunity18 wrote:
and correct it the second CString ==> CString&
Yes. It needs to be the same everywhere you use the template definition. That's why a typedef can simplify things. A typedef creates an alias to the type: typedef CArray< CString , CString &> CMyStringArray; Now you can use "CMyStringArray" instead of "CArray< CString , CString &>" everywhere...
typedef CArray< CString , CString &> CMyStringArray;
...
double CAnaktisiDlg::FindDF(CString file , CMyStringArray &AFArray)
...
void CAnaktisiDlg::GetDF(CMyStringArray &FArray)
...
CMyStringArray FArray;
...
// Call a method/function passing FArray by reference
double retval = FindDF(filestr , FArray);Makes it cleaner to read IMO but you're free to use the long version of course :) Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
I have in project.h void GetDF( CMyStringArray &FArray); double FindDF(CString file , CMyStringArray &AFArray); and it pop up me errors error C2061: syntax error : identifier 'CMyStringArray'
-
I have in project.h void GetDF( CMyStringArray &FArray); double FindDF(CString file , CMyStringArray &AFArray); and it pop up me errors error C2061: syntax error : identifier 'CMyStringArray'
The typedef needs to be visible to any point in the code it is used - Any .h file will do, or even at the bottom of your stdafx.h precompiled header file if it's used all over the place :) Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
-
The typedef needs to be visible to any point in the code it is used - Any .h file will do, or even at the bottom of your stdafx.h precompiled header file if it's used all over the place :) Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
plx plx noob specific language ! :D
-
The typedef needs to be visible to any point in the code it is used - Any .h file will do, or even at the bottom of your stdafx.h precompiled header file if it's used all over the place :) Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
ooooooo ! I leveled up ! \o/ its ok i put it in bottom of stafx.h and works fine :D thanks again ! mark
-
plx plx noob specific language ! :D
The compiler works top-down - so if you refer to some defined type (class, struct, typedef alias, #define, etc) then the definitition needs to be above the code that refers to it. That way the compiler already knows what it means when it sees it. Typically there's a precompiled header file to make builds faster. Typically this file is called stdafx.h. In there is all the common stuff used throughout a project so it's a good place to put anything you want "seen" by the compiler throughout the project. In your example, if the only place you are reffering to "CMyStringArray" is in one header file then you could just put the typedef near the top of that file. Make sense? Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
-
The compiler works top-down - so if you refer to some defined type (class, struct, typedef alias, #define, etc) then the definitition needs to be above the code that refers to it. That way the compiler already knows what it means when it sees it. Typically there's a precompiled header file to make builds faster. Typically this file is called stdafx.h. In there is all the common stuff used throughout a project so it's a good place to put anything you want "seen" by the compiler throughout the project. In your example, if the only place you are reffering to "CMyStringArray" is in one header file then you could just put the typedef near the top of that file. Make sense? Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
yes yes as my before reply i did it :D I leveled up from 100%noob to 80%noob :D
-
ooooooo ! I leveled up ! \o/ its ok i put it in bottom of stafx.h and works fine :D thanks again ! mark
:laugh: leveled up or down!? You're welcome! Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
-
ooooooo ! I leveled up ! \o/ its ok i put it in bottom of stafx.h and works fine :D thanks again ! mark
Oh wait, you said percent noob - that would be up! :)
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
-
Oh wait, you said percent noob - that would be up! :)
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
hehehe :D thanks god I have you guys here and you fill my big holes in C++ programming
-
got 2 function ( second is executed inside first one) how i will pass the CArray class? with my code 1 error : error C2664: 'GetDF' : cannot convert parameter 1 from 'class CArray' to 'class CArray' No copy constructor available for class 'CArray' Error executing cl.exe.
double CAnaktisiDlg::FindDF(CString file , CArray < CString, CString > AFArray) { CString LineRead ; CString str7; CString FilePathName; const int sz =100; char buf[sz]; FilePathName = m_FolderName + file; ifstream FileText(FilePathName); while(FileText.get(buf,sz)) { FileText.get(); LineRead = (LPCSTR) buf; GetDFArray(LineRead); GetDF(AFArray); } FileText.close(); return 0.0; } void CAnaktisiDlg::GetDF(CArray < CString , CString > FArray) { int nDf=0; int niDF = 0; for ( int i = 0 ; i
I have read all the above messages....Great!!!! just want to add one thing since the copy constructor for CArray is explict, therefore you are getting this error.
error C2664: 'GetDF' : cannot convert parameter 1 from 'class CArray' to 'class CArray' No copy constructor available for class 'CArray' Error executing cl.exe.
If constructors are explicit then temporary copies will not be created during parameter passing in function calls. -
got 2 function ( second is executed inside first one) how i will pass the CArray class? with my code 1 error : error C2664: 'GetDF' : cannot convert parameter 1 from 'class CArray' to 'class CArray' No copy constructor available for class 'CArray' Error executing cl.exe.
double CAnaktisiDlg::FindDF(CString file , CArray < CString, CString > AFArray) { CString LineRead ; CString str7; CString FilePathName; const int sz =100; char buf[sz]; FilePathName = m_FolderName + file; ifstream FileText(FilePathName); while(FileText.get(buf,sz)) { FileText.get(); LineRead = (LPCSTR) buf; GetDFArray(LineRead); GetDF(AFArray); } FileText.close(); return 0.0; } void CAnaktisiDlg::GetDF(CArray < CString , CString > FArray) { int nDf=0; int niDF = 0; for ( int i = 0 ; i
I am way late, but Mark Salsbery did not use a single C specific word. Every one was C++ specific, as C does not use direct references (a pointer is an indirect reference). Given a choice between a copy and a reference, use a constant reference unless you want the called function to modify the values passed. If a class is not designed to be passed by value (which you are trying to do) then there is probably a good reason.
INTP "Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra