|
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
|
|
|
|
|
Thanks Rajesh,
So, the guideline should be, making virtual function private, and if we need to call virtual function from base class in derived class, then making virtual function protected? Right?
regards,
George
|
|
|
|
|
Hi,
I have two different dialog based VC++ project called Main & sub.
When a OK button of Main project is clicked I want Dialogbox of Sub to be executed.
Can anybody help.
Thanks,
Bala.
bala_potty
|
|
|
|
|
hi everyone,
good afternoon to all.i am writing one OCX file.in that file i am doing read and write functions. and in another project i am using that OCX.When i am passing parameters to that function then that time values taking as null.in runtime when i given some values to that parameters that time also they are takingas null only.in VC++ how can i pass the parameters by refence please Tell me i am in tension.please.
in OCX file write function is
WriteBlk(LPCTSTR MemId, LPCTSTR MemName, LPCTSTR eDate, LPCTSTR Balance, LPCTSTR TagId);<br />
and in my main project write block is like this:<br />
writeBlk(m_Memid,m_Memname,m_eDate,m_cBalance,m_Tadid);
these variables are of type CString
Thanku in advance,
savitri.
|
|
|
|
|
|
_8086 wrote: Shame
writeBlk(&m_Memid,&m_Memname,&m_eDate,&m_cBalance,&m_Tadid);
delete it before the OP reply the shame to you.
|
|
|
|
|
thanku for helping me.but by using like this i am getting error like this:
error C2664: 'WriteBlk' : cannot convert parameter 2 from 'class CString *' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
Please tell me how shall i pass the parameters.
Thanku in advance,
savitri
|
|
|
|
|
use (const char*) CString. or
char temp[256];
CString cs;
cs.getBuffer(temp,cs.getLength());
cs.ReleaseBuffer();
Now pass the temp.
----------------------------
286? WOWW!
|
|
|
|
|
_8086 wrote: use (const char*) CString
Yes
_8086 wrote: char temp[256];
CString cs;
cs.getBuffer(temp,cs.getLength());
cs.ReleaseBuffer();
Now pass the temp.
No. The temp variable returned by GetBuffer is only guaranteed to be valid up until the time that ReleaseBuffer is called. It is designed to be used when modifying the value of the CString, not for just passing a const pointer.
Judy
|
|
|
|