|
Gregor S. wrote:
I thought he wants to find IE windows, not explorer windows
Confess, you are fixed on IE
...if you're under 8 or younger. Chris Maunder, the Lounge
|
|
|
|
|
I'm using Mozilla
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Explorer also uses 'ExploreWClass' as a class name when it displays the folder tree by default.
people are not very wise / don't know their limitations /
don't know what death means / when they play their dirty games 'Killing Fields' Funker Vogt
|
|
|
|
|
|
i am writing an adventure in vc++6. the problem is, ive include a .ini file, with the possible words that a user could enter. when the user enters a command in the game (at the prompt) the program "scans" this file to see if any words match. the problem lies with the [ ] 's in the .ini file
e.g
[nouns]
1 chair
2 school
etc
so i have used the continue statement to "skip" the headings ([nouns] and so on) the prolem with this is when a user types in a "known" command, the program outputs "Do not recognise command" (its set to do this if the words input arent in the .ini file)
any ideas?
Sas
|
|
|
|
|
Post your code; you have a bug. Just show us the loop that processes comands. remember to wrap the code in <PRE> ... </PRE> tags please.
Signature space for rent. Apply by email to....
|
|
|
|
|
I recomand using
http://www.codeproject.com/cpp/ciniex.asp
or http://www.codeproject.com/cpp/ciniex.asp for ini file acess.
But ur method should work, probably a bug!
Papa
while (TRUE)
Papa.WillLove ( Bebe ) ;
|
|
|
|
|
You should use the GetPrivateProfile* API functions for reading INIs.
"In an organization, each person rises to the level of his own incompetence." Peter's Principle
|
|
|
|
|
I strongly suggest prereading the INI file and putting the words into a CMap.
|
|
|
|
|
Another question about inheritance on operators (such as =):
does it have to apply two object of the same type/class exactly OR can I assign (i.e. '=') an object to another of a sibling class?
Example:
class Base
{
public:
Base& operator = (Base&);
};
class DerivedA
{
public:
DerivedA& operator = (DerivedA&);
};
class DerivedB
{
public:
DerivedB& operator = (DerivedB&);
};
Can I do something like:
DerivedA a;
DerivedB b;
a = b;
?
The reason I m asking is because, I may "exchange" some data fields of object "a" with some of object "b" (actually the data fields shared in Base class!)
Thanks again,
bertrand
|
|
|
|
|
You'd have to provide the following in DerivedA:
DerivedA& operator=(const DerivedB &);
BTW: use const references for arguments of operator =. The right-hand-side object doesn't change when you assign its value.
Also, remember that '=' token (not operator= member function) is used when creating object:
DerivedB b;
DerivedA a = b;
In the case above, the constructor accepting 'const DerivedB&' would be used.
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
Curious as to why you wont use :
Base* a = new DerivedA
Base* b = new DerivedB.
If the data is defined in base (which it should be) then *a = *b should work. Correct me if I am wrong. (its been so long since i have written any real code....sigh!!!!)
|
|
|
|
|
Ranjan Banerji wrote:
If the data is defined in base (which it should be)
I find this statement strange. Why would you limit yourself in such way? Often it's the other way round - you define base class as abstract interface (all pure virtual functions, no data members) and provide implementation in derived class[es].
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
I agree with you completely. I did not intend to impose such a limitation. However, I do prefer data to be at a lower level (closer to base) class rather than a derived class at the end of the hierarchy. So as much as a base class provides the interface I also like it to provide data. Of course this can vary depending on the design requirements.
If each derived class has its own data defined then to a large extent we loose the benefits of inheritance. Now one may argue that a certain design requires a base class for interface only and not data and that is fine too.
Now if you look at the example provided in this dicussion we were talking about creating an operator= for Derived A and B. If the contents of B are to be assigned to A then I suppose it was fair on my part to assume that they both contain the same data and therefore I would hope that the data was defined in Base.
|
|
|
|
|
Ranjan Banerji wrote:
If each derived class has its own data defined then to a large extent we loose the benefits of inheritance
It depends. If you have a common set of data which can be used by all derived classes, then by all means place then in base class. However, this is quite rare. Usually your derived classes represent different entities which share part of the implementation (including data members) and add their own stuff.
Take the proverbial example with shape hierarchy. You could place 'color' attribute in the base class (assuming that each shape has exactly one color), but surely you won't add 'center' there, because it would be used by cirle, but not by polygon.
Going back to the operator= example - I think it's easy way to shoot yourself in the foot. If you want to copy you should provide the operator= or other method, otherwise adding new members to derived classes will break the program.
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
Now you are making me respond just for the sake of this discussion .
There is always a design option available for those real life cases, such that data is represented at a lower level, though not necessarily at the abstract base class level.
Taking the shape example one could could have the BaseShape class from which which one could derive single color classes and other color classes etc. From which you derive the various shapes etc.
Now this may be overkill, but there is almost (keyword is almost) always a design solution available.
|
|
|
|
|
I don't see your point. You've started with cast to base class and call to operator= which probably cause slicing. Then you argue that it's viable option, because if you don't store the data in base class then you'll lose the advantages of inheritance.
The approach you propose is IMHO dangerous and applicable in rare case when derived classes differ only in their behavior (do not introduce data members). This rare case can exist for a while in given project, but it's trivial to break it by adding data member(s) to derived class. The program will still compile, but it won't work correctly anymore.
So I can't any advantage of using *a=*b where a and b are cast from derived to base.
Ranjan Banerji wrote:
Taking the shape example one could could have the BaseShape class from which which one could derive single color classes and other color classes etc. From which you derive the various shapes etc
Would you cast to BaseShape and use operator= then?
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
If you use :
base *shape1 = new Shape1
base *shape2 = new Shape2
then you can do *shape1 = *shape2 without casting assuming the data is in base and base has an operator=
|
|
|
|
|
And you've just introduced tight coupling between Shape1 and Shape2. You can't add any data member to Shape1/Shape2 without breaking your program at runtime, since compiler will not barf at you.
Is this something you do frequently in your projects?
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
You are proving to be denser than what I thought. Sorry for my comment but instead of trying to get my point you seem to be focussing on proving me wrong. If thats your attention then let me boost your ego by saying yes you are right. A lot simpler. Learn to smile.
If you learn to design your code KEYWORD is design then you should not be facing the issue of adding data to the Shape1 and Shape2.
That is why you have design prior to coding. Ever heard of that concept?
And yes. If your design requires that Shap1 and 2 have their own data then you do not use the base class operator=. Then one could do what you suggested.
Now I have work to do. So flame away. And have a nice day.
|
|
|
|
|
Ranjan Banerji wrote:
If you learn to design your code KEYWORD is design then you should not be facing the issue of adding data to the Shape1 and Shape2
This is my point, dude. No matter how well you design Shape1 and Shape2 you risk that your program will burn in flames when you use the construct you've proposed (cast/operator= on base), because its enough to change the *implementation* of Shape[1|2]. This breaks the encapsulation; you could use memcpy as well
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
The point you are not getting is that right from the start I have been saying that you are right. I simply said that it is possible to use the base class operator IF you had stable design and if the data was encapsulated at the base level.
You missed out on my IF.
Also, in my experience and this is just my experience it has been rare to do derived1 = derived2. Its like saying if we had a base class of mammals and a derived dog class and derived cat class and then we are saying dog = cat. Which does not exactly make sense. And so once again the design question comes up as to is the class hierarchy correctly designed? If so then why do we need derived1 = derived2.
Now I really need to go and work.
|
|
|
|
|
Hi,
I am creating a framework for an acquisition of (sampled) data, e.g. images at a certain 'sampling' (every 2sec for ex.).
I'd like to use some interfaces to create a kinda 'generic' framework in C++ (therefore by using pure abstract classes):
First, each sample data has basic functionalities, described in an interface:
class ISampleData
{
public:
virtual bool Load(const char* lpszFilenameIn) = 0;
virtual bool Save(const char* lpszFilenameOut) = 0;
...
};
Second, a 'generic' interface for an acquisition digitizer describes basic features:
class IInputDigitizer
{
public:
virtual ISampleData& Acquire() = 0;
...
};
Then, I'd like to create an implementation of these interfaces in the case of image acquisition:
class CImage : public ISampleData
{
public:
CImage();
virtual ~CImage();
virtual bool Load(const char* lpszFilenameIn);
virtual bool Save(const char* lpszFilenameOut);
...
};
class CCameraDigitizer : public IInputDigitizer
{
public:
CCameraDigitizer();
virtual ~CCameraDigitizer();
virtual CImage& Acquire();
...
};
Some problems occur when I try something like this in the main prog:
m_lpDigitizer = new CCameraDigitizer();
CImage image = m_lpDigitizer->Acquire();
with, of course, the error
error C2440: 'initializing' : cannot convert from 'ISampleData' to 'CImage'
I m not sure I understand the problem (reverse polymorhism? pb with abstract class instantiation?)
What can be a cure? a solution? without loosing this kind of design "Generic to Specialized using the elegance of interfaces".
Thanks a lot,
Bertrand
|
|
|
|
|
Bertrand Boichon wrote:
CImage image = m_lpDigitizer->Acquire();
Acquire probably returns ISampleData by value. And you can't copy ISampleData to CImage, because CImage is more complex. You should change the type of 'image' variable to ISampleData *, and return pointer from Acquire.
Tomasz Sowinski -- http://www.shooltz.com
*** Si fractum non sit, noli id reficere. ***
|
|
|
|
|
Thanks for your answer Tomasz!
Actually today, while working on the problem, I figured that if I cast it back to "CImage&" it then works!
CImage image = (Cimage&) m_lpDigitizer->Acquire();
But I am not sure I understand why...
I am not very familiar with references and pointers, but in your answer (use of ISampleData*), it seems I would need a dynamic alloc (using new) in the implementation of "Acquire" method, and I will have to destroy the object later (uding delete).
Instead, I'd like to copy the object created in "Acquire", into the object "image" (i.e. "image = m_lpDigitizer->Acquire();").
That is: using the stack, not the heap.
All the best,
bertrand
|
|
|
|