|
Get into the habit of handling errors via exception handling. Here's more.[^]
Regards,
Alvaro
Hey! It compiles! Ship it.
|
|
|
|
|
Great! Thaks alot for clearing things up!
Rickard Andersson
Here is my card, contact me later!
UIN: 50302279
Sonork: 37318
Interests: C++, ADO, SQL, Winsock, 0s and 1s
|
|
|
|
|
Exceptions are for truly exceptional errors. Like the file you are working on has suddely disapeared, or you cant get enough memory etc. That Kind of things that you can never be sure when it happenes.
Return code , to the contrary are the everyday case of an error: All those stuff you know that can happen, but your routine can't cope with on itself, like a file can not be opened, user gave your parser too few arguments, the file format of your data is not as expected etc.
All this are things that happen quite often, and you can think of them easily, but your routine must rely on its caller to solve them (e.g. query the user, something your file-handling routines should do, as they are not part of the GUI).
Who is 'General Failure'? And why is he reading my harddisk?!?
|
|
|
|
|
I agree with (almost ) everything above, but also believe...
That you should only consider throwing exceptions when you fully understand the consequences of doing so, specifically issues to do with the overheads, resource aquistion and stack unwinding. Writing consistantly exception safe c++ code is extremely hard, even for the best programmers.
Herb Sutter and Scott Meyers have some superb articles on Exception safety, I strongly recommend you look at their material.
Error codes are appropriate in situations where performance is absolutely critical or exception safety is not an option. Two examples are some operating systems, old versions of CE AFAIK, and the standard IOStreams library.
The C/C++ Users Journal tend to spend a significant ammount of time covering this type of issue.
If you can keep you head when all about you
Are losing theirs and blaming it on you;
If you can dream - and not make dreams your master;
If you can think - and not make thoughts you aim;
Yours is the Earth and everything that's in it.
Rudyard Kipling
|
|
|
|
|
In VC++ 6.0, Windows 2000, how to schedule a thread to run on a specific CPU?
Is there any APIs or methods?
Thanks,
Leo
|
|
|
|
|
|
Thanks.
|
|
|
|
|
Here's the situation:
class A
{
public:
friend ostream& operator<<(ostream& os, const A& a)
public:
void ShowExpandedInfo() { cout<<this <<endl; }
};
=================
class B : public A
{
public:
void RunOuterLoop();
};
=================
int main()
{
A a;
B b;
b.RunOuterLoop();
return 0;
}
==================
void B::RunOuterLoop()
{
ShowExpandedInfo();
}
The problem (as you all know) is that in activating ShowExpandedInfo (from RunOuterLoop), what gets shown, is B's data instead of A's.
Inside the 'friend' function is where I do formatting (etc.) of A's data prior to printing.
I've tried just about every trick and clever idea I could come up with, to get A's data to show, which the compiler dutifully shoots down every time.
The sample is not written in stone. It gets changed around with some of the various things I try. What is shown, is merely a starting point to demonstrate the general layout of code, and what I'm trying to accomplish.
I would be remiss if I didn't say one of the things I tried, was to use a 'const' reference of 'A' as a parameter of RunOuterLoop (and changed the code to suit that approach). It didn't work, since that simply showed and empty 'A'.
Thanks for any thoughts or ideas on how I can get A's object to show from 'B'?
William
Fortes in fide et opere!
|
|
|
|
|
Your design is actually wrong because operators of course cannot be virtual. Why don't you simply make a virtual toString() function that you call in the overloaded operator <<?
If you want to use polymorphism you really should be using pointers. I fail to see the point of your code.
You seem to have overcomplicated something that is very simple
|
|
|
|
|
It's because operators are not virtual why I used a friend function to do the overloading, and it's because friends are not inheritable why the function to show the data is declared and defined in the base class.
Polyphormism was actually one of the things I tried, which turned out to be more work without the solution I sought. I pretty much obtained the same result just as when I didn't use it, and it's because an object of a derived class can be treated an object of its corresponding base class, why I didn't see a need for other polymorphic attempts.
Instead of talking about overcomplicating something that you see as "simple", why didn't you present your "simple" solution?
William
Fortes in fide et opere!
|
|
|
|
|
I did present a simple solution. Reread my post?
|
|
|
|
|
What you're trying to do is strange. The compiler is behaving correctly. When you say "cout << this << endl; " this is an instance of B so that's what's being passed to the << operator.
I also don't understand what you mean by: it shows B's data instead of A's. B's data is also A's. B is just an extended version of A. I don't see how the two would be different. Perhaps you could extend your example to show what you mean by A's data vs. B's data.
In case you haven't, here's a couple more things to try inside your operator:
1. (A)a.some_data
2. a.A::some_data
Regards,
Alvaro
Hey! It compiles! Ship it.
|
|
|
|
|
Thanks for replying.
I am NOT disputing the compiler at any time is wrong; just the opposite (which is why I am still looking for a way to get what I'm trying to accomplish.)
It is because the compiler is right, why the code (the way it's shown in the example) is "showing B's data instead of A's." By that I mean, because 'ShowExpandedInfo' is activated from inside a B's function, the "this" pointer is physically and logically referring to 'B' as its object, and is what gets shown. It has nothing here to do with 'B' being a part of 'A' due to the inheritance relationship.
While it is true that B's data is also A's (due to the inheritance relationship), the converse is NOT true (that 'A' is a part of 'B'). Therefore, when 'B' uses a pointer to refers to data (as "this" in the case at hand), even if that pointer could be used to access A's data, what you end up getting, is strictly B's data.
Yes, there is the matter of explicit casting, but that is something I prefer to stay away from (for the time being) and use ONLY as the very last resort.
Thanks again for replying.
William
Fortes in fide et opere!
|
|
|
|
|
I'll bite...
This may not be the solution you need, but you could make the ShowExpandedInfo() method virtual and in the derived class you could call A::ShowExpandedInfo(). The bad thing is, it would probably show A and B.
A better solution might be to get a B pointer instead and cast it however you want it to be used. Like this:
A* ptrA = NULL;
B* ptrB = new B;
ptrA = (A*)B;
ptrA->RunOuterLoop();
ptrB->RunOuterLoop();
You can pass ptrA around and cast it back to a B* since that's what it really is. I've got some code at work doing this sort of thing so if my memory of this is wrong I can look it up tomorrow.
"It is better to remain silent and be thought a fool than to open one's mouth and remove all doubt." - Abraham Lincoln
|
|
|
|
|
Thanks for replying.
What you have suggested regarding the explicit casting of a pointer to 'B', cast as a pointer to 'A', has some merit and may work. I say this because I haven't tried the explicit casting of pointers yet (and will do so ONLY as the very last resort).
I've chosen to try polymorphism, friend functions and even "slicing" (though this is just as bad as explicit casting, except you don't have to re-cast things back to set everything back in sync).
My hope was that someone might know of a clever way using friend function, smart pointer or even overloading the 'member access operator' (alias: the "->" operator).
This quest is NOT over. As Churchill adequately put it, "This is not the end. It's not even the beginning of the end. It's only the end of the beginning." The first round went to the compiler, and we are just starting the second round.
William
Fortes in fide et opere!
|
|
|
|
|
Hello,
I would like to set the intermediate files path from the Project Settings > Settings For > Win32 Debug/Release > General tab to a global folder. It would allow me to build my projects in a temporary folder that I can delete and clean up any time without deleting nor affecting my working projects.
Its default value is Debug or Release, depending of the configuration you select, Win32 Debug or Win32 Release (for a MFC application). I created an environment variable named "vcc_tmp". Using the command line I can change the current directory to that folder using "chdir %vcc_tmp%". Windows knows that it has to replace %vcc_tmp% by its value.
So I tried it with VC++ but it doesn't replace the variable by its value, "%vcc_tmp%\MyApp\Debug" doesn't work. It creates a new folder named "%vcc_tmp%".
The problem is that a lot of people are working on many projects. Lot of people, lot of projects. So I can't affort choosing "static" path for all these projects. Each developers would have to create an environment variable "vcc_tmp" and set it to its temp folder. I don't want to choose "c:\vcc_tmp" as some people can't use their c: drive to store temp files. Moreover using the OS drive as a tmp drive is not a good idea, defrag, scan... No no no .
So if you have any remarks and suggestions or solutions, don't hesitate to reply to that thread. All help is welcome.
Kind regards,
JM. Molina
Earth > Europe > France > Lyon
|
|
|
|
|
Hello all,
Currently, I need to write a program which allows the users to select a specific folder on the hard drive. However, I only know how to use MFC to allow the users to select specific file on the drive by using "GetOpenFileName()". Is there any way which allows users to select a folder rather than a file in MFC?
Thanks!!!!
Nachi
|
|
|
|
|
SHBrowseForFolder() or you could use one of the many folder selection dialogs at CP.
/ravi
Let's put "civil" back in "civilization"
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
Sorry,
I am not really know how to use this function, is there any example so that I can study on, thanks!
Nachi
|
|
|
|
|
Yes, MSDN Library.
Rickard Andersson
Here is my card, contact me later!
UIN: 50302279
Sonork: 37318
Interests: C++, ADO, SQL, Winsock, 0s and 1s
|
|
|
|
|
|
I know this is a visual c++ forum and I'm really sorry, but this seems to be the only lounge where I get the best answers to questions, so please don't get too mad that this question is a little more general and not focused solely on visual c++.
On a normal coordinate system, the Y-Axis is positive in the upward direction and X-Axis in the right direction, which naturally makes the Z-Axis positive coming towards you. On a computer screen, however, we still measure the X-Axis as positive to the right, but now the Y-Axis is positive going downward, so is the Z-Axis now positive away from the viewer?
I'm asking this for finding the normal line to a polygon on the monitor, trying to determine if it is front or back facing. I just need to know for sure if I'm doing this correctly or not.
Again, sorry this isn't really a C++ question, but I think the people in this forum are the best with quick and intelligent responses!
Douglas A. Wright
dawrigh3@kent.edu
|
|
|
|
|
AFAIK X-axis is always positive to the right, Z-axis is always positive towards the viewer, and Y-axis is positive up in every mode except text mode, in which case it is positive down.
Sonork 100.11743 Chicken Little
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
Within you lies the power for good - Use it!
|
|
|
|
|
That is correct, for OpenGL. You can of course change between left hand and right hand coords in both OpenGL and Direct3D.
|
|
|
|
|
Can anyone tell me how to get around problems created by Norton AV and other antivirus software? For instance, a lot of products on the market are realtime products. They record music, they play music, they create documents, and so forth. How have people gotten around how Norton AV realtime protection handles files? I cannot be the only person who has problems with a product that creates files and Norton AV interferes with this, can I? Am I making any sense?
I was once told that if you have a product that creates files, antivirus software locks the file when it is scanning. And to get around such problems, you have to work with Symantec. Does anyone know for certain?
|
|
|
|
|