|
Apstolo wrote: how can i add a method to the graphics class to add an triangle whitou declaring an array of triangles and the pass the reference to the vector.
You can simply do that:
Form* pTriangle = new triangle;<br />
...<br />
...<br />
...<br />
Form.push_back(pTriangle);
As triangle inherits from Form, it is a Form. That's the principle of polymorphism.
BTW, I'm think Form is not a correct word, you should prefer Shape instead (not sure but I never heard this word used for such purpose, except in french ).
|
|
|
|
|
Cédric,
Yes you are right, i mean Shape instead of Form, i'm portuguese and shape is Forma, and it was a inconscious association, lol.
But you dind't answerd to my question. see this example:
....
#include "Triangle"
#include "Square"
Class X{
....
....
std::vector<shape*> Shapes;
....
}
void X::addTriangle(..parameters..)
{
Triangle aux(..parameters..);
Shapes.push_back(&aux);
}
--------------------
The problem is that wen the method ends it destroys the aux and the reference/adress is lost
and then is an obvius error when i will try to access that adress.
The only way tath a see to resolve is to have an array of triangles, sqares, circles, etc..
an then add the aux to that array, and then push that adress to the Shapes vector, so it's redundant and usless to have the abstract class.
|
|
|
|
|
Apstolo wrote: But you dind't answerd to my question.
Yes I did, I even gave you a snippet of code
Apstolo wrote: The problem is that wen the method ends it destroys the aux and the reference/adress is lost
and then is an obvius error when i will try to access that adress.
That's why you should use a pointer and create the object with new (like I showed in my example). But don't forget to delete the objects when you empty your container.
The reason is because the object is local to your function and will be destroyed when the function exits.
Apstolo wrote: The only way tath a see to resolve is to have an array of triangles, sqares, circles, etc..
an then add the aux to that array, and then push that adress to the Shapes vector, so it's redundant and usless to have the abstract class.
That won't change anything, the problem will be the same.
Sorry, I misread your explanation. Anyway that is not the best way to do that. It is much better to manage yourself the lifetime of your object using new/delete in that case.
-- modified at 10:42 Tuesday 2nd October, 2007
|
|
|
|
|
Tanks Cédric,
It works!!!!
when i first wrote your code, it was almost equal to my way to create and pass the Triangle-Shape, so i belived that you didn't understod my question, and i did a quick example to test your example , and i got an error, so i assumed that it was the error i expected. after your last post, i retryed to do the example and it was another line code that trigged the error.
I'm realy sory. But now it is working.
you was very helpfull!!!!
|
|
|
|
|
If I am debugging a (32-bit) app using VC6 on Vista 64-bit, and I break out, then the app I am debugging is left running, despite the debugger ending the debugging (apparently successfully). The process appears in task manager, but attempts to kill it simply do nothing (no error, just nothing). The app is locked, so I can't rebuild it, so it's definately loaded into memory somehere. The only way to get out of the situation is to close my VC and re-start it.
Anyone else having this problem? Any one know a fix?
Paul.
"The way of a fool seems right to him, but a wise man listens to advice" - Proverbs 12:15 (NIV)
|
|
|
|
|
Hi,
I'm modifying a property sheet that has two pages, but also has a view window that displays a graphic based on the data the user is editing. I'd like what is drawn to depend on the current active tab, but I'm not sure how to do this. Is there some sort of tab switching event that my sheet can respond to?
|
|
|
|
|
Have you looked at PSN_ messages?
- NS -
|
|
|
|
|
Hi all,
I am testing a certain function and I am getting an error
"error C2660: 'boost::unit_test::make_test_case' : function does not take 3 arguments"
This is the code below:
#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;
test_suite* init_unit_test_suite( int argc, char* argv[] )
{
test_suite* test = BOOST_TEST_SUITE( "Test Convert" );
boost::shared_ptr<MailFile<MAPIMSG>> instance( new MailFile<MAPIMSG> );
test->add( BOOST_CLASS_TEST_CASE(&MailFile<MAPIMSG>::Convert, instance) );
return test;
}
What is wrong with this code?
|
|
|
|
|
Can anybody tell me what is the use of abstract class
since we cant instantiale the abstract class... so why we are using it...
and one more question...
if we define a function as const and static in a class so what are the diffreence when we create the instance of that class other then if we dont define... as static and const..
thanks
tasu
|
|
|
|
|
tasumisra wrote: Can anybody tell me what is the use of abstract class
since we cant instantiale the abstract class... so why we are using it...
Abstract classes are used when you want to provide a common base class to several objects but you don't want to be able to instantiate it directly. Maybe a little example will make things clear.
Suppose you are writing an asteroid game in which you can have several 'entities': the player plane, the asteroids and the missiles shooted by the player ship. Obviously, they all have some common 'functionalities' (they need to be drawn on the screen, you can move them, they can be destroyed, ...), so it make sense to inherit from a common base class, the CEntity class (for example). Of course, you don't want to be able to instantiate a CEntity directly so, you will make it an abstract class. For example how to draw the different entities on the screen depends on the entity itself, so you can make this function a pure virtual function (meaning that the child classes MUST implement this method, which is logical).
Hope this makes a little bit more sense.
|
|
|
|
|
tasumisra wrote: so why we are using it...
To provide an interface which can have different implementations (derived concrete classes).
|
|
|
|
|
tasumisra wrote: Can anybody tell me what is the use of abstract class
since we cant instantiale the abstract class... so why we are using it...
To enable polymorphism.
That's the, um, abstract answer. A more concrete answer...
Consider your computer. You can swap out different parts, put in a new hard drive, exchange your soundcard for a better one, put in a DVD burner, etc. In order for this to work, each component has to adhere to an interface the computer recognizes. This allows the components to be interchanged.
Abstract classes provide the same kind of functionality only with software instead of hardware. An abstract class representing an interface can be used as a base class. Derived classes provide the actual implementation. Because they all have the same base class, they can be exchanged in certain parts of the software just like the hardware components described above.
tasumisra wrote: if we define a function as const and static in a class so what are the diffreence when we create the instance of that class other then if we dont define... as static and const..
I'm not sure I understand the question. static methods exist at the class level. They don't rely on a specific instance of the class to exist.
|
|
|
|
|
hi! Can I create a theme and in my application create a control with theme, which is created by me, using SetWindowTheme etc.? Does anybody know how do it (create a theme and "connect" to it)?
Thanks for any helps
|
|
|
|
|
Ok, I have the function with signature:
bool fncSame(std::string &x, std::string &y)
and a pointer defined as :
typedef bool (*pf)(std::string &, std::string &);
and
pf pfn = &WorkerClass::fncSame;
but it throws the error:
error C2440: 'initializing' : cannot convert from 'bool (__thiscall WorkerClass::* )(std::string &,std::string &)' to 'WorkerClass::pf'
what am I doing wrong?
TIA
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." - Rick Cook
"There is no wealth like knowledge, no poverty like ignorance." Ali ibn Abi Talib
|
|
|
|
|
Member functions and globabl functions don't have the same prototype: for member function, an implicit parameter is passed in the argument list (the this pointer, identifying to which class instance the function belongs to). Thus, they are not compatible.
A way to solve the problem is to declare your member function as static, but then it won't belong to any instance (meaning that it won't be able to access non-static class members).
I think you can also declare in the function pointer that the function belongs to a certain class (but I'm not qbsolutely sure, you have to try it out):
typedef bool (WorkerClass::*pf)(std::string &, std::string &);
|
|
|
|
|
Nope,
gave me this error instead:
error LNK2019: unresolved external symbol "public: bool __thiscall WorkerClass::fncSame(class std::basic_string<char,struct std::char_traits<char="">,class std::allocator<char> > &,class std::basic_string<char,struct std::char_traits<char="">,class std::allocator<char> > &)" (?fncSame@WorkerClass@@QAE_NAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) referenced in function "public: __thiscall WorkerClass::WorkerClass(void)" (??0WorkerClass@@QAE@XZ) WorkerClass.obj
now its getting so that I don't understand what the error means
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." - Rick Cook
"There is no wealth like knowledge, no poverty like ignorance." Ali ibn Abi Talib
|
|
|
|
|
That is a different error: now your code compiles correctly but you have a linker error. It simply means that your function is known by the compiler (you provided a prototype) but no implementation has been found. So, provide an implementation and that will probably solve the problem.
|
|
|
|
|
Cedric Moonen wrote: Member functions and globabl functions don't have the same prototype
But the method fncSame is not a global function
But I do see what you mean and why that would be a possible issue.
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." - Rick Cook
"There is no wealth like knowledge, no poverty like ignorance." Ali ibn Abi Talib
|
|
|
|
|
Mustafa Ismail Mustafa wrote: But the method fncSame is not a global function
No, but that's what I said. Your typedef defines a pointer to a global function, not for a class method. And your fnSame is a class method.
So, they are not compatible.
|
|
|
|
|
Thanks Cedric, got it working
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." - Rick Cook
"There is no wealth like knowledge, no poverty like ignorance." Ali ibn Abi Talib
|
|
|
|
|
hi friends,
i have a very basic doubt regarding the file operations using FILE * fp.
i.e. how can i delete a record from a file.
|
|
|
|
|
Basically deletion of data from a file requires the following steps
1. Create a new file
2. Copy all the content from source file, excluding the data to be deleted
3. Delete the source file
4. Rename the new file as the source file
- NS -
|
|
|
|
|
thanks boss,
but till now i had been implementing this technique.
i wanted some straight forward alternative.
thank you.
|
|
|
|
|
If you work with records (formatted data) you can make a flag that the record is deleted. Than you have only to change a byte in the file.
Greetings from Germany
|
|
|
|
|
I had the same problem once. And I made it as KarstenK has said.
I was setting a flag that meant "deleted" but with one difference. That was only while the programm was running. When the programm was closing (OnDestroyWindow (), OnCloseDocument () or any other message you want to use) I made an update from file doing the process that NS17 has told you. Is the only process I know to do it with FILE. Another thing is with CArchive and its Serialize.
Making it so, you have max quickness during programm execution but the report stays in "desirable" limits. If not, after some "days" you may have a report with lots of deleted members which flag has to asked too know if they are valid or "deleted"
Greetings.
--------
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
|
|
|
|
|