|
|
Got it Thanks.
bala_potty
|
|
|
|
|
In the below example, I just push some pointers to objects of type myClass into the vector. Previously, When I pushed just the objects as such, the find algo worked with the overloaded "==". But it's now pointers inside the vector. And I want the find algo still to find it, with integer as the passed argument for it. How can I do it?
class myClass
{
public:
int x;
int y;
bool operator == (const int& n)
{
cout<<"\nCheck";
cout<<"\n"<<n<<"\t"<<x;
return(n==x);
}
};
std::vector<myClass*> vec_myClass;
myClass* obj = new myClass();
obj->x=1;
obj->y=1;
vec_myClass.push_back(obj);
myClass* obj2= new myClass();
obj2->x=2;
obj2->y=2;
vec_myClass.push_back(obj2);
int n=2;
vector<myClass*>::iterator itr_vec = vec_myClass.begin();
itr_vec =std::find(vec_myClass.begin(),vec_myClass.end(),n);
<br />
itr_vec =std::find(vec_myClass.begin(),vec_myClass.end(),n); <br />
Here it's not taking "n" , and I can also guess why isn't taking. It actually expects an overload of == where we pass a pointer to the object itself. Is there anyway I can do it? Just by passing int?
----------------------------
286? WOWW!
modified on Saturday, March 15, 2008 1:37 PM
|
|
|
|
|
_8086 wrote: It actually expects an overload of == where we pass a pointer to the object itself. Is there anyway I can do it? Just by passing int?
Atleast one formal parameter of operators must be of non pointer class type, otherwise you can simply add a global operator == for type "myClass *" and int. But you can achieve it very easily with a another class which exposes the overloaded operator.
say,
class CSearchKey
{
public:
int m_iVal;
CSearchKey(int iVal)
:m_iVal (iVal)
{
};
};
inline bool operator == (const myClass *pObj, const CSearchKey &rKey)
{
return(*pObj==rKey.m_iVal);
}
And in your original code you only want to change as follows.
itr_vec =std::find(vec_myClass.begin(),vec_myClass.end(),CSearchKey(n));
hope this solves.
|
|
|
|
|
Hello Rajkumar, thanks for your effort. I get these following errors. How did you manage to compile? I'm using VC8.0
error C2804: binary 'operator ==' has too many parameters
error C2333: 'myClass::operator ==' : error in function declaration; skipping function body
The whole program:
class CSearchKey
{
public:
int m_iVal;
CSearchKey(int iVal)
:m_iVal (iVal)
{
};
};
class myClass
{
public:
int x;
int y;
inline bool operator == (const myClass *pObj, const CSearchKey &rKey)
{
return(*pObj==rKey.m_iVal);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<myClass*> vec_myClass;
myClass* obj = new myClass();
obj->x=1;
obj->y=1;
vec_myClass.push_back(obj);
myClass* obj2= new myClass();
obj2->x=2;
obj2->y=2;
vec_myClass.push_back(obj2);
int n=2;
vector<myClass*>::iterator itr_vec = vec_myClass.begin();
itr_vec =std::find(vec_myClass.begin(),vec_myClass.end(),CSearchKey(n));
if(itr_vec!=vec_myClass.end())
cout<<"\n\nResult:"<<(*itr_vec)->x<<"\n\n";
return 0;
}
----------------------------
286? WOWW!
|
|
|
|
|
the newly suggested operator is to be in global scope not in the class myclass, and you commented the already existing operator but that is used in the global == operator. Don't you see == operator takes multiple parameter its not a class member.
keep your code unchanged, don't comment the == operator in myclass. then the move the inline == operator to global, just below the CSearchKey class, use it in a header so that if you are using it in multiple cpp file this becomes inline and no additional code is generated for this. only thing you have to modify in your original code is whenever you search for int n search with CSearchKey(n). Try and let me know.
|
|
|
|
|
Great that's works! Thanks a lot. But why is not taking int as a parameter for == ? What harms it?
For example,
<br />
inline bool operator == (const myClass *pObj,const int& n)<br />
{ <br />
return(pObj->x==n);<br />
}<br />
itr_vec =std::find(vec_myClass.begin(),vec_myClass.end(),n);<br />
instead of,
<br />
inline bool operator == (const myClass *pObj,const CSearchKey &rKey)<br />
{ <br />
return(return(pObj->x ==rKey.m_iVal););<br />
}<br />
itr_vec =std::find(vec_myClass.begin(),vec_myClass.end(),CSearchKey(n));<br />
Why does it require a paramter of class type??
operator ==' must have at least one formal parameter of class type
I dont understand this requirement.
----------------------------
286? WOWW!
|
|
|
|
|
if both parameters are pointers or primitive types it takes pure comparison of values. (int and void *).
_8086 wrote: But why is not taking int as a parameter for == ?
you can have wrapper for "myClass *", ptrMyClass as we did for int, CSearchKey.
then inline bool operator == (const myClass *pObj,const int& n) can be used as
inline bool operator == (const ptrMyClass &ptrObj,const int& n) but then you have to store in vector as vector<ptrmyclass>.
|
|
|
|
|
Hello everyone,
Any ideas why Pimpl idiom is called "Compilation Firewalls"?
http://www.gotw.ca/gotw/024.htm
I have thought for a while, and I think client code does not need to compile in Pimpl idiom, so like a firewall to block compile, it is called "Compilation Firewalls".
Any ideas why it is named "Compilation Firewalls"?
thanks in advance,
George
|
|
|
|
|
Probably because Herb Sutter (the author of GoTW) liked it ?
pimpl, when well executed, will prevent (thus a "firewall" or insulating) a lot of dependent re-compilation when the private implementation
of a class changes.
dependent of a class should never, in the best case, know the private implementation of a class; I've even seen some design that put all private methods as free functions in the code.
|
|
|
|
|
Thanks Maximilien,
Question answered.
regards,
George
|
|
|
|
|
Hello,
I am naive to Windows Services.
I have few queries regarding Windows Services which are as follows: -
How to manage User account?
For example there are several users present on a single machine and how to restrict users group from accessing the Windows Service?
Can do it using CoInitializeSecutriy(), if yes then How?
Thanks in Advance.
|
|
|
|
|
Hello everyone,
Why do we need to fine a virtual function as private? As special functions we can achieve and any special limitaitons?
thanks in advance,
George
|
|
|
|
|
|
Thanks Vasudevan,
Great link! Especially this one, http://www.gotw.ca/publications/mill18.htm[^]
I have a further question, it is always mentioned "preconditions and postconditions", like in the above link, what means "preconditions and postconditions" in the article?
--------------------
First, note that the base class is now in complete control of its interface and policy, and can enforce interface preconditions and postconditions, insert instrumentation, and do any similar work all in a single convenient reusable place - the nonvirtual interface function. This promotes good class design because it lets the base class enforce the substitutability compliance of derived classes in accord with the Liskov Substitution Principle[3], to whatever extent enforcement makes sense. If efficiency is an issue, the base class can elect to check certain kinds of pre- and postconditions only in a debug mode, for example via a non-debug "release" build that completely removes the checking code from the executable image, or via a configurable debug mode that suppresses selected checking code at runtime.
--------------------
regards,
George
|
|
|
|
|
we don't need them, so don't use them.
|
|
|
|
|
Thanks Maximilien,
You mean you have not used private virtual function before?
regards,
George
|
|
|
|
|
|
Thanks Maximilien,
Seems virtual functions should be made virtual, and if we need to access virtual function of base class from derived class, then we should make it protected. Right?
If you do not agree or have some comments, please feel free to share here.
http://www.gotw.ca/publications/mill18.htm[^]
regards,
George
|
|
|
|
|
The most common use of private virtual functions is the Template method design pattern[^].
Note how in the Java example the "abstract methods" are public even if they are not meant to be called ouside of the class. With C++, they can be private and the user would be able to call directly only playOneGame which better reflects the design of the class.
|
|
|
|
|
A template method defines the program skeleton of an algorithm. The algorithm itself is made abstract, and the subclasses override the abstract methods to provide concrete behavior.
First a class is created that provides the basic steps of an algorithm design. These steps are implemented using abstract methods. Later on, subclasses change the abstract methods to implement real actions. Thus the general algorithm is saved in one place but the concrete steps may be changed by the subclasses.
"Subclasses" do they mean a derived class?
If it's private(in context with the OPs question), how the derived class can make use of it. (Forget friends!)
----------------------------
286? WOWW!
|
|
|
|
|
Hi _8086,
I think Subclasses means derived class.
regards,
George
|
|
|
|
|
Hi George, thanks a lot.
----------------------------
286? WOWW!
|
|
|
|
|
Thanks Nemanja,
I have studied the link. Great!
Two more comments,
1.
What do you mean "even if they are not meant to be called ouside of the class"? Could you provide more description or provide sample code please?
2.
Nemanja Trifunovic wrote: they can be private
What do you mean "they"? What methods do "they" cover in the sample code of class Game?
regards,
George
|
|
|
|
|
George_George wrote: Why do we need to fine a virtual function as private?
The classic answer, because you don't want to expose everything to the world?
See this example:
class base
{
public:
void Interface()
{
Implementation();
}
private:
virtual void Implementation(void)
{
cout<<"Haha lol I am private - Base"<<endl;
}
};
class der:public base
{
void Implementation(void)
{
cout<<"I am private too - Derived"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
base bs;
bs.Interface();
der dr;
dr.Interface();
return 0;
}
George_George wrote: As special functions we can achieve and any special limitaitons?
Here, the virtual functions are visible down through the hierarchy to the child classes, but only the base would actually get to access it!
Please see this[^] and this one[^] too.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|