|
Thanks for the comments,
EDIT:
with optimizations turned on, using value = var.var is 1.3 times faster than using a function like value = var.var(). But at millionth's of a second for getting a value 900 million times.
woops, I used an unsigned int for a very big loop, so the value wasn't actually retrieved 900 million times. I recalculated (incrimenting a double for loops) and found that one hundred million value = var.var is 1.0366 times faster than one hundred million value = var.var()
oh, unsigned ints have range 0 to 4,294,967,295
So I guess there isn't much difference in speed using a function to retrieve values.
nevertheless, that was really silly of me, I could easily achieve the same effect as what I originally intended by :
class Class1
{
protected:
int var;
}
and then uncomment public: when building a project.
The reason I would want to do this is because to me, protected values should be values that can be read from but not written to (outwidth the class), so when editing using intellisense it's useful for me to see what variables I intend to be protected in the "Let me know when it's ok and when it's not ok to change them" sense.
But I would probably only do this when i'm editing code, otherwise make variables always public if someone else is editing it. see what I mean.
but given that the speed difference of using a get function is so minute, I'll probably start using get functions. though for certain special cases I might want to treat a variable as "protected" but still be able to change it in different scopes so my technique might be useful there.
|
|
|
|
|
doug25 wrote: protected values should be values that can be read from but not written to (outwidth the class)
You should revise a bit your C++ books . Protected doesn't mean that at all. It simply means that the classes which are inheriting from your class will have access to all protected members (as if they were public) but the rest of your program won't be able to access to members. If a member is private, then the inheriting classes can't access these members. (This is only valid for public inheritance, which is the most common used).
Anyway, what you are doing makes the code horribly hard to maintain because if another programmer reads your code, he won't be able to understand anything of what you were trying to do. As others already said, use getters/setters and turn on optimization, this is by far the best solution because it is standard.
|
|
|
|
|
yes, I know what protected means , I think for projects that aren't personal i'll use the get standard, but I'm not keen on it because sometimes it could be useful to be able to modify protected members in global scope, so I've come up with the following to compensate for the rare circumstances :
#ifdef EDITINGCODE
#define PROTECTED protected
#else
#define PROTECTED public
#endif
class Class1
{
PROTECTED:
int var;
};
thanks for the advice however
|
|
|
|
|
You're hardly "protecting" them by making them public for reading and writing.
Why not make the get public and the set protected?
I'm not totally clear on why you're trying to do this, but if it's only to make Intellisense behave the way you want, then I would'nt be changing code for it.
|
|
|
|
|
yes, PROTECTED doesn't actually protect the member variables but it lets me see what variables aren't supposed to be changed in normal circumstances without using member functions.
PROTECTED member variables are public at compile time but when i'm editing code, intellisense will inform me that changing them directly is "dangerous" while their values can safely be read.
So the reason for using it is that I can see more clearly how certain member variables were indended to be used, to make editing code easier. And also, because it seems unnecessary to use get functions when I could read directly from a variable. I like the coding style, but if I was going to do a project involving more people then I'd resort to the standard way. I think it should be possible to read from protected variables but not write to them so having PROTECTED lets me see what variables shouldn't be written to without using class functions but I still have the privaledge to read from them.
|
|
|
|
|
?????
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!"
|
|
|
|
|