473,395 Members | 1,905 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

Interface implementation

Hi all. I have some questions about interface implementation, if
anybody can help me, I will be very thank.
So:

If i have some interface IA:

class IA
{
virtual void SomePureVirtFunc() = 0;
};

and some class B, that implemented that interface:

class B : public IA
{
virtual void SomePureVirtFunc() {};
};

Now I need in class C inherit from interface ITwoInOne, that inherited
from IA also.
Question: it is any method, inherit from interface ITwoInOne, and
don't implement interface IA, but using multiple inheritance - inherit
from class B, that already implemented that interface, and satisfy my
requirements?

Another words: can I write something like that:

class NewOne : public B
, public ITwoInOne
{
//Implementation only pure virtual functions
//, that not correspond to IA interface
}

P.S. sorry for confusion, and for my bad English.

Jun 14 '07 #1
17 1785
Galian wrote:
Hi all. I have some questions about interface implementation, if
anybody can help me, I will be very thank.
So:

If i have some interface IA:

class IA
{
virtual void SomePureVirtFunc() = 0;
};

and some class B, that implemented that interface:

class B : public IA
{
virtual void SomePureVirtFunc() {};
};

Now I need in class C inherit from interface ITwoInOne, that inherited
from IA also.
Question: it is any method, inherit from interface ITwoInOne, and
don't implement interface IA, but using multiple inheritance - inherit
from class B, that already implemented that interface, and satisfy my
requirements?
Yes, inherit from IA _virtually_ *everywhere*. I.e. make B inherit from
IA virtually and make ITwoInOne inherit virtually.
>
Another words: can I write something like that:

class NewOne : public B
, public ITwoInOne
{
//Implementation only pure virtual functions
//, that not correspond to IA interface
}

P.S. sorry for confusion, and for my bad English.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 14 '07 #2
Yes, inherit from IA _virtually_ *everywhere*. I.e. make B inherit from
IA virtually and make ITwoInOne inherit virtually.
So this is right way:

class B : public virtual IA
{

};

class NewOne : public virtual B
, public virtual ITwoInOne
{

};

Is this right?
If yes, than question: is order of classes for inheritance important?
I mean it is OK if I write first "public virtual ITwoInOne", and than
"public virtual B"?

Jun 14 '07 #3
Galian wrote:
>Yes, inherit from IA _virtually_ *everywhere*. I.e. make B inherit
from IA virtually and make ITwoInOne inherit virtually.

So this is right way:

class B : public virtual IA
{

};

class NewOne : public virtual B
, public virtual ITwoInOne
{

};

Is this right?
If yes, than question: is order of classes for inheritance important?
I mean it is OK if I write first "public virtual ITwoInOne", and than
"public virtual B"?
I think that the order is not significant. Have you tried it? If you
have, and the success depended on the order, could you please share?
If you haven't tried, why?

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 14 '07 #4
I have tried, and it don't work. "Cannot instantiate abstract class"
error. I don't now why. I tried different order, but it don't help.
Thank you Victor for the answers.

Jun 14 '07 #5
Galian wrote:
I have tried, and it don't work. "Cannot instantiate abstract class"
error. I don't now why. I tried different order, but it don't help.
Sounds like FAQ 5.8 should help. Check it out. It also can be that
your compiler is not capable; we'll know as you check out the FAQ.
Thank you Victor for the answers.
You're most welcome.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 14 '07 #6

Victor Bazarov :
Galian wrote:
I have tried, and it don't work. "Cannot instantiate abstract class"
error. I don't now why. I tried different order, but it don't help.

Sounds like FAQ 5.8 should help. Check it out. It also can be that
your compiler is not capable; we'll know as you check out the FAQ.
Thank you Victor for the answers.

You're most welcome.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Sorry Victor, but about what FAQ you talking? Where can I find it?

Jun 14 '07 #7
Galian wrote:
Victor Bazarov :
>Galian wrote:
>>I have tried, and it don't work. "Cannot instantiate abstract class"
error. I don't now why. I tried different order, but it don't help.
Sounds like FAQ 5.8 should help. Check it out. It also can be that
your compiler is not capable; we'll know as you check out the FAQ.

Sorry Victor, but about what FAQ you talking? Where can I find it?
C++ FAQ: http://www.parashift.com/c++-faq-lite
FAQ 5.8: http://www.parashift.com/c++-faq-lit...t.html#faq-5.8
Jun 14 '07 #8
Galian wrote:
Victor Bazarov :
>[..] check out the FAQ.
[..]
Sorry Victor, but about what FAQ you talking? Where can I find it?
Is that your first day here?

http://www.parashift.com/c++-faq-lite/

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 14 '07 #9
Sorry Victor, but about what FAQ you talking? Where can I find it?

Wow, I understand :) sorry.

This is my code. Task is next: I want write template class, CUnknown,
with implemented nessesary methods (Queryinterface, Release ...), to
use it for other classes.

CUnknown:

template < class ClassType, REFIID ObjectIID >
class CUnknown : public IUnknown
{
protected:
// IUnknown methods.
virtual STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
{
if ( ppv == NULL )
{
return E_POINTER;
}
if ( riid == *ObjectIID || riid == IID_IUnknown )
{
*ppv = static_cast< ClassType* >( this );
AddRef();
return S_OK;
}
*ppv = NULL;
return E_NOINTERFACE;
}

virtual STDMETHODIMP_( ULONG ) AddRef()
{
return InterlockedIncrement( &m_cRef );
}

virtual STDMETHODIMP_( ULONG ) Release()
{
LSCOPE( "CMediaBuffer::Release" );
LONG lRef = InterlockedDecrement( &m_cRef );
if ( lRef == 0 )
{
delete this;

// m_cRef is no longer valid! Return lRef.
}
return lRef;
}

LONG m_cRef;
};

#include "Unknown.h"

class ISMSNotificationHandler
{
public:
virtual void HandleSMSMessageReceived( const CEOID messageID ) = 0;
};

// IMAPIAdviseSink also derived from IUnknown

class CAdviseSinc
// This is my CUnknown,but anyway "Cannot instantiate abstract
class" error
: public virtual CUnknown< CAdviseSinc, IID_IMAPIAdviseSink >
, public virtual IMAPIAdviseSink
{
public:
CAdviseSinc();
~CAdviseSinc();

private:
ULONG OnNotify( ULONG cNotif, LPNOTIFICATION lpNotifications );
};
>>Is that your first day here?
Actually in this group yes, but not in other, I am sorry.

Jun 14 '07 #10
Galian wrote:
[..]
This is my code. Task is next: I want write template class, CUnknown,
with implemented nessesary methods (Queryinterface, Release ...), to
use it for other classes.

CUnknown:

template < class ClassType, REFIID ObjectIID >
class CUnknown : public IUnknown
What's "IUnknown"? Are we supposed to know about it? (pun intended)
I am guessing that it's the base interface you have and it's abstract.
{
protected:
// IUnknown methods.
virtual STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
{
if ( ppv == NULL )
{
return E_POINTER;
}
if ( riid == *ObjectIID || riid == IID_IUnknown )
{
*ppv = static_cast< ClassType* >( this );
AddRef();
return S_OK;
}
*ppv = NULL;
return E_NOINTERFACE;
}

virtual STDMETHODIMP_( ULONG ) AddRef()
{
return InterlockedIncrement( &m_cRef );
}

virtual STDMETHODIMP_( ULONG ) Release()
{
LSCOPE( "CMediaBuffer::Release" );
LONG lRef = InterlockedDecrement( &m_cRef );
if ( lRef == 0 )
{
delete this;

// m_cRef is no longer valid! Return lRef.
}
return lRef;
}

LONG m_cRef;
};

#include "Unknown.h"
I am guessing that's where your 'class CUnknown' is defined, or is it?
>
class ISMSNotificationHandler
{
public:
virtual void HandleSMSMessageReceived( const CEOID messageID ) = 0;
};

// IMAPIAdviseSink also derived from IUnknown

class CAdviseSinc
// This is my CUnknown,but anyway "Cannot instantiate abstract
class" error
Does it say what function prevents it from being instantiated?
>public virtual CUnknown< CAdviseSinc, IID_IMAPIAdviseSink >
, public virtual IMAPIAdviseSink
{
public:
CAdviseSinc();
~CAdviseSinc();

private:
ULONG OnNotify( ULONG cNotif, LPNOTIFICATION lpNotifications );
};
OK. Try to change the beginning of the definition of 'CUnknown' to

template < class ClassType, REFIID ObjectIID >
class CUnknown : virtual public IUnknown
^^^^^^^

Also, do the same with IMAPIAdviseSink. What you're doing is telling
the compiler that some pure virtual functions in your 'CAdviseSink'
only exist in a single base class instance and that they are happily
overridden by the corresponding functions in 'CUnknown<blah,blah>'.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 14 '07 #11
Ok, this is my code now:

//CUnknow class

template < class ClassType, REFIID ObjectIID >
class CUnknown : public IUnknown
{
protected:
// IUnknown methods.
virtual STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
{
if ( ppv == NULL )
{
return E_POINTER;
}
if ( riid == ObjectIID || riid == IID_IUnknown )
{
*ppv = reinterpret_cast< ClassType* >( this );
AddRef();
return S_OK;
}
*ppv = NULL;
return E_NOINTERFACE;
}

virtual STDMETHODIMP_( ULONG ) AddRef()
{
return InterlockedIncrement( &m_cRef );
}

virtual STDMETHODIMP_( ULONG ) Release()
{
LONG lRef = InterlockedDecrement( &m_cRef );
if ( lRef == 0 )
{
delete this;
// m_cRef is no longer valid! Return lRef.
}
return lRef;
}

LONG m_cRef;
};

// IMAPIAdviseSink also derived from IUnknown

class CAdviseSinc
: public virtual CUnknown< CAdviseSinc, IID_IMAPIAdviseSink >
, public virtual IMAPIAdviseSink
{
public:
CAdviseSinc() {};
~CAdviseSinc() {};

private:

ULONG OnNotify( ULONG cNotif, LPNOTIFICATION lpNotifications )
{ return 0; }
};

Now,if I try to create instance of class CAdviseSinc, i have this
message:

error C2259: 'CAdviseSinc' : cannot instantiate abstract class
due to following members:
'HRESULT IMAPIAdviseSink::QueryInterface(const IID &,LPVOID
*)' : is abstract
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0
Pocket PC SDK\include\ARMV4I\mapidefs.h(889) : see declaration of
'IMAPIAdviseSink::QueryInterface'
'ULONG IMAPIAdviseSink::AddRef(void)' : is abstract
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0
Pocket PC SDK\include\ARMV4I\mapidefs.h(889) : see declaration of
'IMAPIAdviseSink::AddRef'
'ULONG IMAPIAdviseSink::Release(void)' : is abstract
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0
Pocket PC SDK\include\ARMV4I\mapidefs.h(889) : see declaration of
'IMAPIAdviseSink::Release'

but this three methods are implemented in CUnknown.

Jun 14 '07 #12
Galian wrote:
Ok, this is my code now:

//CUnknow class

template < class ClassType, REFIID ObjectIID >
class CUnknown : public IUnknown
I am sorry to sound a bit irritated, but didn't I just tell
you to use virtual inheritance *here* AND in the *definition*
of 'IMAPIAdviseSink'? You decided NOT TO follow that and
instead derived virtualy *from* 'IMAPIAdviseSink'. Am I just
being unclear somehow?
{
protected:
// IUnknown methods.
virtual STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
{
if ( ppv == NULL )
{
return E_POINTER;
}
if ( riid == ObjectIID || riid == IID_IUnknown )
{
*ppv = reinterpret_cast< ClassType* >( this );
AddRef();
return S_OK;
}
*ppv = NULL;
return E_NOINTERFACE;
}

virtual STDMETHODIMP_( ULONG ) AddRef()
{
return InterlockedIncrement( &m_cRef );
}

virtual STDMETHODIMP_( ULONG ) Release()
{
LONG lRef = InterlockedDecrement( &m_cRef );
if ( lRef == 0 )
{
delete this;
// m_cRef is no longer valid! Return lRef.
}
return lRef;
}

LONG m_cRef;
};

// IMAPIAdviseSink also derived from IUnknown

class CAdviseSinc
>public virtual CUnknown< CAdviseSinc, IID_IMAPIAdviseSink >
, public virtual IMAPIAdviseSink
{
public:
CAdviseSinc() {};
~CAdviseSinc() {};

private:

ULONG OnNotify( ULONG cNotif, LPNOTIFICATION lpNotifications )
{ return 0; }
};

Now,if I try to create instance of class CAdviseSinc, i have this
message:

error C2259: 'CAdviseSinc' : cannot instantiate abstract class
due to following members:
'HRESULT IMAPIAdviseSink::QueryInterface(const IID &,LPVOID
*)' : is abstract
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0
Pocket PC SDK\include\ARMV4I\mapidefs.h(889) : see declaration of
'IMAPIAdviseSink::QueryInterface'
'ULONG IMAPIAdviseSink::AddRef(void)' : is abstract
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0
Pocket PC SDK\include\ARMV4I\mapidefs.h(889) : see declaration of
'IMAPIAdviseSink::AddRef'
'ULONG IMAPIAdviseSink::Release(void)' : is abstract
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0
Pocket PC SDK\include\ARMV4I\mapidefs.h(889) : see declaration of
'IMAPIAdviseSink::Release'

but this three methods are implemented in CUnknown.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 14 '07 #13

Victor Bazarov :
Galian wrote:
Ok, this is my code now:

//CUnknow class

template < class ClassType, REFIID ObjectIID >
class CUnknown : public IUnknown

I am sorry to sound a bit irritated, but didn't I just tell
you to use virtual inheritance *here* AND in the *definition*
of 'IMAPIAdviseSink'? You decided NOT TO follow that and
instead derived virtualy *from* 'IMAPIAdviseSink'. Am I just
being unclear somehow?
Sorry I forgot it, fixed, now CUnknown look like it:

template < class ClassType, REFIID ObjectIID >
class CUnknown : public virtual IUnknown
{
..
..
..
but error message the same as before

Jun 14 '07 #14
Galian wrote:
Victor Bazarov :
>Galian wrote:
>>Ok, this is my code now:

//CUnknow class

template < class ClassType, REFIID ObjectIID >
class CUnknown : public IUnknown

I am sorry to sound a bit irritated, but didn't I just tell
you to use virtual inheritance *here* AND in the *definition*
of 'IMAPIAdviseSink'? You decided NOT TO follow that and
instead derived virtualy *from* 'IMAPIAdviseSink'. Am I just
being unclear somehow?

Sorry I forgot it, fixed, now CUnknown look like it:

template < class ClassType, REFIID ObjectIID >
class CUnknown : public virtual IUnknown
{
.
.
.
but error message the same as before
OK. Let's put your code aside for a minute. Try the following:
------------------
class I { virtual void foo() = 0; };
class C : virtual public I { void foo() {} };
class II : virtual public I {};
class CC : public C, public II {};

int main() {
CC cc;
}
------------------
Does it compile with your compiler? If it doesn't, your compiler is
non-compliant and you will have to work around its shortcomings. You
will need to re-implement the "offending" functions in the final class
and in them simply call the one you want to work as the overrider.

If the code does compile, please study it and make the necessary changes
to *your* code.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 14 '07 #15

Victor Bazarov :
Galian wrote:
Victor Bazarov :
Galian wrote:
Ok, this is my code now:

//CUnknow class

template < class ClassType, REFIID ObjectIID >
class CUnknown : public IUnknown

I am sorry to sound a bit irritated, but didn't I just tell
you to use virtual inheritance *here* AND in the *definition*
of 'IMAPIAdviseSink'? You decided NOT TO follow that and
instead derived virtualy *from* 'IMAPIAdviseSink'. Am I just
being unclear somehow?
Sorry I forgot it, fixed, now CUnknown look like it:

template < class ClassType, REFIID ObjectIID >
class CUnknown : public virtual IUnknown
{
.
.
.
but error message the same as before

OK. Let's put your code aside for a minute. Try the following:
------------------
class I { virtual void foo() = 0; };
class C : virtual public I { void foo() {} };
class II : virtual public I {};
class CC : public C, public II {};

int main() {
CC cc;
}
------------------
Does it compile with your compiler? If it doesn't, your compiler is
non-compliant and you will have to work around its shortcomings. You
will need to re-implement the "offending" functions in the final class
and in them simply call the one you want to work as the overrider.

If the code does compile, please study it and make the necessary changes
to *your* code.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Yes it compiled, only warning "warning C4250: 'CC' : inherits
'C::C::foo' via dominance
.\ConsoleSmart.cpp(45) : see declaration of 'C::foo'"

Thank you very much. Sorry for the trouble.

Jun 14 '07 #16
On Jun 14, 3:32 pm, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
Galian wrote:
Yes, inherit from IA _virtually_ *everywhere*. I.e. make B inherit
from IA virtually and make ITwoInOne inherit virtually.
So this is right way:
class B : public virtual IA
{
};
class NewOne : public virtual B
, public virtual ITwoInOne
{
};
Is this right?
If ITwoInOne inherits from IA, it must also inherit virtually.
If NewOne is the most derived class, on the other hand, virtual
inheritance from B and from ITwoInOne is not necessary, although
it may be a good idea, in case someone later wants to inherit
from it. (In general, unless the inheritance tree is closed,
most inhertance should be virtual.)
If yes, than question: is order of classes for inheritance important?
I mean it is OK if I write first "public virtual ITwoInOne", and than
"public virtual B"?
I think that the order is not significant.
It affects the order in which constructors are called. In the
case of virtual base classes, the constructors are called from
the most derived class, "in the order they appear on a
depth-first left-to-right traversal of the directed acyclic
graph of base classes, where `left-to-right' is the order of
appearance of the base class names in the derived class
base-specifierlist."

It will also typically affect the actual layout, and may have
some effect on runtime, although I can't imagine this being
significant.
Have you tried it? If you
have, and the success depended on the order, could you please share?
If you haven't tried, why?
Note that trying it doesn't tell you anything about the
guarantee. The order you find might be because in the standard,
the order was implementation defined, or unspecified.
Experimentation is usually a pretty poor means of finding out
these sort of things; the poster is doing the right thing in
asking.

--
James Kanze (GABI Software, from CAI) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Jun 15 '07 #17
James Kanze wrote:
On Jun 14, 3:32 pm, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
>Have you tried it? If you
have, and the success depended on the order, could you please share?
If you haven't tried, why?

Note that trying it doesn't tell you anything about the
guarantee.
No, but it gets him closer to _a_ solution so he can move onto more
important things in life than looking for guarantees.
The order you find might be because in the standard,
the order was implementation defined, or unspecified.
Is it?
Experimentation is usually a pretty poor means of finding out
these sort of things; the poster is doing the right thing in
asking.
<sighMaybe, in this particular case. I am not sure what you
mean by "these sort of things", though. WHAT sort of things?

I say, push that "compile" button without asking first, since
nothing bad can come out of it, really. There is no sense in
asking "will such and such code compile?" when you have a compiler
sitting right there. One could ask "_should_ such and such code
compile" or "is my compiler correct to {accept/reject} such and
such code", but I still don't see a reason not to try.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 15 '07 #18

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
by: Anon Email | last post by:
Hi people, I'm learning about header files in C++. The following is code from Bartosz Milewski: // Code const int maxStack = 16; class IStack
3
by: Sai Kit Tong | last post by:
I posted for help on legacy code interface 2 days ago. Probably I didn't make it clear in my original mail. I got a couple of answers but none of them address my issues directly (See attached...
3
by: John Underwood | last post by:
Hi.. I was looking at interface, and I have a example in the docs i'll paste below.. I'm not grasping what you would gain by using a interface, does any one have a brief description of their...
21
by: Helge Jensen | last post by:
I've got some data that has Set structure, that is membership, insert and delete is fast (O(1), hashing). I can't find a System.Collections interface that matches the operations naturally offered...
15
by: jon | last post by:
How can I call a base interface method? class ThirdPartyClass :IDisposable { //I can not modify this class void IDisposable.Dispose() { Console.WriteLine( "ThirdPartyClass Dispose" ); } } ...
4
by: Ray Dukes | last post by:
What I am looking to do is map the implementation of interface properties and functions to an inherited method of the base class. Please see below. ...
6
by: Ricky W. Hunt | last post by:
It's dawning on my a lot of my problems with VB.NET is I'm still approaching it in the same way I've programmed since the late 70's. I've always been very structured, flow-charted everything, used...
8
by: Gregory | last post by:
I have a question about using STL containers in C++ class public interface. Lets say that I want to return some container from class method or accept class method parameter as some container. For...
15
by: Xah Lee | last post by:
On Java's Interface Xah Lee, 20050223 In Java the language, there's this a keyword “interfaceâ€. In a functional language, a function can be specified by its name and parameter specs....
52
by: Ben Voigt [C++ MVP] | last post by:
I get C:\Programming\LTM\devtools\UselessJunkForDissassembly\Class1.cs(360,27): error CS0535: 'UselessJunkForDissassembly.InvocableInternals' does not implement interface member...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.