Re: Future of C++
On Aug 11, 3:27 pm, Andre Kaufmann <akfmn...@t-online.de> wrote:
Eugene Gershnik wrote:
On Aug 10, 12:15 pm, Andre Kaufmann <akfmn...@t-online.de> wrote:
Eugene Gershnik wrote:
No I only state that COM interfaces are commonly declared this way:
__declspec(novtable) struct ....
and commonly a guid is assigned by using:
struct __declspec(uuid("xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"))
and therefore the compiler has enough information about the struct to be
a COM interface,
This is getting rather platform specific but I hope moderators will
let this through since at least some of it applies to standard C++.
1. Both these attributes do *not* say that the class they apply to is
a COM interface. The first one is a nice optimization for any abstract
class as we already discussed and is sometimes (often?) used for non
COM classes. The second associates a unique identifier with a class
(another facility sorely missing from standard C++) and is also
sometimes used in non COM contexts for things like serialization.
2. A lot of classes that do represent COM interface do not use either
attribute
I repeat: there is NO way for the compiler to detect that a certain C+
+ class is used as a COM interface. If you don't believe me, fine, but
then please explain how exactly it should be done. A solution that
work only in some cases isn't good enough given the amounts of
existing code we are talking about. A solution with false positives
(like the one above) is even worse.
Not to mention that saome people do put ctor/dtor in the
class/struct representing COM interface just for completeness.
Which is against the definition of interfaces - even if there isn't
anything like them in C++.
I have no idea what "definition of interface" means to you but to me
in C++ an interface is a pure abstract class. A class in C++ always
has a constructor and destructor even if the user doesn't write them
down. The fact that those are inaccessible to outside code can be
expressed by making them protected. The 100% correct interface today
looks like
class ISomething : public IUnknown
{
public:
virtual unsigned long foo() = 0;
protected:
ISomething()
{}
~ISomething()
{}
};
If you suggest that this code is somehow incorrect C++ then I fail to
understand your reasoning.
--
Eugene
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]