[SOLVED] Friend class using base class
-
hi, I have two classes using each other:
@// Message.hpp
include "StatusController.hpp"
class Message : public QObject
{
Q_OBJECT
friend class StatusController;public: enum MessageType { Unknown, Discover, Alive, KeepAlive, Bye, Received, Confirmed, Answer, Text, }; private: quint32 m_id; MessageType m_type; Service m_sender; QString m_content;
};@
@// StatusController.php
include "Message.hpp"
class Message;
class StatusController : public QObject
{
Q_OBJECT
private:
QQueue<Message> m_statusList;public: StatusController(Message::MessageType type, QObject *parent = 0);
};@
The forward declaration of Message is because the compilation failed because of the QQueue line.
Now the compilation fails (error: incomplete type 'Message' named in nested name specifier) on the constructor line.I understand that the compiler can't know Message::* AND the friend class inside, at the same time. Is there a way to achieve what I'm trying to do?
Thanks for your help.
-
Hi,
It's because you are using a QQueue<Message> rather than QQueue<Message *>.
Forward class declaration are used for pointers variable only.
-
You need to include the header if you want to use an enum from a class.
-
Look at line 3 of "StatusController.php", it's included.
The forward declaration removed the compilation error about QQueue, but the enum is undefined.Which is logical because StatusController needs Message to be defined, which needs StatusController to be at least declared, etc...
-
You don't need to include anything to declare a friend. You need it when you are actually using that friend class so generally in the cpp file.
-
Oh GOOD !
I've never used friends, I didn't know... Removing the inclusion made disappear ALL the errors:
- Enum not know
- QQueue<Message> (anyway, Qt's containers are storing pointers)
- Forward declaration not needed (it removed some errors, but useless now).
Thank you for that, I wouldn't have thought about inclusion not needed. !