|
?????
You're trying to bypass good things that were developed to stop you from doing bad things when writing code, Intellisense was expensively developed to warn you of these things! Someone somewhere spent blood sweath an tears getting it to work. If you don't want it, why not swich it off altogether.
Bypassing it in the manner you suggested would make your code very hard to maintain, and, it allows you to do write the type of code that probably contains latent bugs! Also, if you switch off your Manifest in the Release Version, you end up with two versions: Debug and Retail, which are potentially vastly different. What about 'Surviving the Release'
Bram van Kampen
|
|
|
|
|
No, the use of the PROTECTED macro actually makes code more maintainable and less prone to bugs, because the thing is, for a class in my project I was just going to make all the member variables public anyway but by placing the PROTECTED macro before their declarations, it allows me to see clearly that they are not ordinary public members since they should be changed with precaution when changing their values is required.
And using the macro in my project also makes better use of intellisense since it will show that the member variables are protected which in the case of classes written by myself means they are allowed to be read from but usually shouldn't be written to directly.
Of course some members may use the actual protected access specifier but if somehow a coding mistake is made to access those when they shouldn't be accessed then the compiler will produce errors at compile time where i.e. the PROTECTED macro is turned off (becomes #define PROTECTED public).
Well, I know it maybe doesn't seem like a good idea but while using this technique it's actually working very well in my project. public, protected and private are basically for editing purposes anyway and I can't see why you would decide to try and defy access rights to member variables so the PROTECTED macro seems pretty good cause it makes it easier to see how a member variable is intended to be used. Maybe there's a better name for the macro but PROTECTED suits me
|
|
|
|
|
Well,
If you think this is a good Idea, so be it! Use it, No-one can Stop you. The point is, you put the question on this forum, expecting a response about whether or not this was a good idea or not. Most members (including Myself) seem to think that it is NOT a good idea.
You, on the other hand seem to think that it is a GOOD Idea, and seem to be looking for approval by the wider community.
And then I hear you say: Historically, many good Idea's were first frowned upon and dismissed by the established scientific community.
Maybe you should not have posted this idea as a question on the forum, but as an Article, titled say 'How to defeat Protected Storage Class Warnings in Intelisense'
That would have been a guide about how to do something, rather than a question about if what you're doing is good or bad.
Bram van Kampen
|
|
|
|
|
doug25 wrote: the use of the PROTECTED macro actually makes code more maintainable and less prone to bugs
Spend some time actually maintaining code and you'll see just how wrong that statement is.
doug25 wrote: see clearly that they are not ordinary public members since they should be changed with precaution
Clearly see? Seeing something is worthless without enforcing it, and that's what private/protected is for. I guarantee you that when someone comes along later and sees that they can easily modify the internals of all of your classes because they're public, they'll do it. Unless you design your classes to prevent misuse, they'll be misused and then they'll be broken. When something is public, that means that it's open to the wild and it should be changed however and whenever the programmer wants.
One of the general principals in OO is that objects should interact with each other through their public interfaces and not care about each others internal states. When you violate this it generally means that classes are too tightly coupled and therefore not very reusable (and hence, not well defined). This is such a fundamental concept of OO that C# has turned encapsulation into a feature of the language itself. See Properties[^]. Being able to directly read/write the internal state of other objects shreds this concept completely.
doug25 wrote: public, protected and private are basically for editing purposes anyway
No, they're not. They are for creating reusable, maintainable, self contained objects with well defined interfaces not just for you but for everyone else that will come along later and use/edit your code.
I agree with Cedric that you may need to go reread a few chapters of your C++ book.
doug25 wrote: PROTECTED
As a great (fictional) man once said: You keep using that word, I do not think it means what you think it means.[^]
|
|
|
|
|
thanks for the feedback.
well, I think your right. It would be better to just implement get and set functions rather than what I've been doing.
The only possible draw back is speed, but there might not be any difference (I think it's just my own paranoia getting to me).
Superman suggested I could check the assembly output, does this mean the assembly code that is produced when code is compiled to read a variable from a get function and read a variable directly ? I don't know how to check the assembly output or what part of it to examine ?
Ok, the assembly / machine code output of variable = instance.getVar() is not the same as variable = instance.var
I took timed measurements (optimizations on), reading from a variable directly seemed faster than using a function, but I'll reimplement the code for my actual project and see if there's a noticable difference in speed. If there isn't then I think I'll have to agree that in 99.99% or 100% of cases, it would be better to use the standard method.
modified on Monday, December 28, 2009 5:39 AM
|
|
|
|
|
I've removed the macro I was using in my project and I'm using the standard protected access specifier with get and set functions as people have recommended, and the difference in fps (with VSync turned off) is unnoticable.
So the classes are correctly encapsulated, coded in a standard format and there's no drop in performance.
So you were all right that making variables protected and accessing them through get functions is probably in 100% of cases the best way to go, when direct outside modification to variables should be prevented.
thanks for all the advice.
|
|
|
|
|
I'm glad that you've come around. Wikipedia has a good little collection of quotes about code optimization that you might like: clickety[^]
|
|
|
|
|
thanks very much.
useful quotes.
|
|
|
|
|
Amen
Bram van Kampen
|
|
|
|
|
Hello,
I want to display cyrillic alphabet in a text box read from a file but I cannot display it properly and when displaying I can see only ?????. Please help me to display cyrillic alphabet characters.
Kind regards,
Bhanu
|
|
|
|
|
You are either doing a non-Unicode build, or you do not have the language installed on your computer. If you can see and type the said character in notepad, then you have the language installed on your machine. You just need to do a fully Unicode build.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
In TagInfo.cpp,i assigned value for the varaible BlinkBr =1.
in the same class i have function which is using this variable for fillign rect as below
pDC->FillRect(StRect,&Brush[BlinkBr]); in the function DrawBar.
Im callig this fucntion from differnt class like
From GroupView.Cpp
pTagBase->DrawBar(pMemDC,x,clnRect,FALSE);
Here the BlinkBr is as it 1 and its working fine.
But assigning value for BlinkBar is not done in DrawBar,its in another function in TagInfo.cpp
Im using this same fucntionality in another class
From Tuning.Cpp
pTagBase->DrawBar(pMemDC,((rTuningScreen.right+AlignX(5,rTuningScreen))/8)*7,rTuningScreen,FALSE);
But while debugging when the cursor goes to this fucntion,the BlinkBr show some garbage value.
I used headerfile everything like Groupview.But this class shows error.
Why its happening?
The same problem i find in different functionalities.Pls help me.
Anu
|
|
|
|
|
Having garbage sounds like the variable is not being initializated correctly.
Are you giving the value at the beggining of your DrawBar function? or at the beggining of your class?
it could be that in your GroupView you use more parts of TagInfo.cpp than only the function DrawBar and because of that you are having the value initialized, but... in your Tuning.cpp you just call the function and the variable hasn't been correctly initializated, but the debug mode does it for you giving garbage value.
Try putting some stop points for the debugger in your TagInfo.cpp and see what happens when you get in the class coming from the other two using the function.
Regards.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
Rating helpfull answers is nice, but saying thanks can be even nicer.
|
|
|
|
|
When i debugged,i found in Tuning.cpp,before that DrawBar fucntion,im calling one more TagInfo.cpp function called DrawTuning().But in that function i dont use this variable..in watch window i can find that till BlinkBr value is in 1 until the last line of DrwaTuning() fucniton.When the cursor gets out of the fucntion,suddenly BlinkBr value has gone to some garbage value like 8603485..
Anu
|
|
|
|
|
Are you giving values to BlinkBr locally? or in the constructor?
Your description sound like using local but needing global values.
On the other hand, is BlinkBr needed always with value 1?
If yes... why don't you use a constant instead of a variable?
#define BLINKBR 1 // placed in your main .h
If not... you can declare your BlinkBr in a place and acces it using "extern" where you need it.
Regards.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
Rating helpfull answers is nice, but saying thanks can be even nicer.
|
|
|
|
|
Hi masters!
I'v written a code by which I can add a new section to pe files. But as I've noticed, some pe files are a little more intelligent than I thought Because as soon as I run them after I add the new section, a message says to me that this file has been modified! Even when I change a few first opCode begining at their entry point without add any section to them and without making any other change to them, the same message appears! Do you think they're "packed"? How can I find out? How can I find the original entry point?
Thank you masters!
|
|
|
|
|
Actually what you want to achieve?
First thing, you can modify, but which tool you are using hexeditor?
If you want to get the Load address which is entry point of the PE.
then you can get that.
HMODULE hModDLL = LoadLibraryEx( "path\name.exe", NULL, DONT_RESOLVE_DLL_REFERENCES );
Величие не Бога может быть недооценена.
|
|
|
|
|
Is there any file browser control in MFC? my requirement is, the application should allow the user to browse a file, based on the user selection i should get the selected file name and the corresponding file path to do some operations on that file. please provide the solution for this problem, thanks in advance
Regards,
Anil
hi
|
|
|
|
|
Why don't you just use CFileDialog class?
Thank you masters!
|
|
|
|
|
A sample code to select Text/CSV file here:
CFileDialog l_SampleDlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"Text Files (*.txt)|*.txt|Comma Separated Values(*.csv)|*.csv||");
int iRet = l_SampleDlg.DoModal();
CString l_strFileName;
l_strFileName = l_SampleDlg.GetPathName();
if(iRet == IDOK)
MessageBox(l_strFileName);
else
MessageBox("No File Selected!");
--
"Programming is an art that fights back!"
|
|
|
|
|
|
Well, no responses, but I was digging through the cheat engine source and I found
VOID
RtlCopyMemory(
IN VOID UNALIGNED *Destination,
IN CONST VOID UNALIGNED *Source,
IN SIZE_T Length
);
... Go me... cheers!
|
|
|
|
|
|
Im not so sure I can use some of those functions you mentioned as they include Windows.h (the goal is a driver that is injected into the kernal that will read/write ram), I dont have my DDK installed as a virus ate my system =(. but Ill check em out. Thanks man!
EDIT: new question, maybey it will get answered before I find the answer: How do I receive the debug messages from my driver?
ie)DbgPrint("Exception in GetMemoryRegionData\n");
modified on Saturday, December 26, 2009 3:10 PM
|
|
|
|
|
Mattzimmerer wrote: How do I receive the debug messages from my driver?
DebugView from sysinternal DebugView[^]
Be wary of strong drink. It can make you shoot at tax collectors - and miss.
Lazarus Long, "Time Enough For Love" by Robert A. Heinlein
|
|
|
|
|