C ++ compilation when two classes reference each other

I am trying to write a simple wrapper around a connection pointer that will return it to the pool when the shell is destroyed, but it will not compile because ConnectionPool and AutoConn must be declared by each other.

I tried using direct braking, but it did not work. How can i solve this? (using g ++)

class Connection {};

class ConnectionPool
{
    Connection *m_c;
public: 
    AutoConn getConn()
    {
        return AutoConn(this, m_c); // by value
    }

    void releaseConnection(Connection *c)
    {
    }
};

class AutoConn
{
    ConnectionPool* m_pool;
    Connection *m_connection;
public:
    AutoConn(ConnectionPool* pool, Connection *c) : m_pool(pool), m_connection(c) {}
    ~AutoConn()
    {
        m_pool->releaseConnection(m_connection);
    }
};
+5
source share
7 answers

A combination of direct declaration and separation of the declaration from the definition of members with cyclic dependencies is performed. For instance:

class Connection {};
class ConnectionPool ;

class AutoConn
{

    ConnectionPool* m_pool;
    Connection *m_connection;
public:
    AutoConn(ConnectionPool* pool, Connection *c) : m_pool(pool), m_connection(c) {}
    ~AutoConn() ;  // Not defined here because it accesses unknown members of class Connection
} ;

class ConnectionPool
{
    Connection *m_c;
public: 
    AutoConn getConn()
    {
        return AutoConn(this, m_c); // by value
    }

    void releaseConnection(Connection *c)
    {
    }
};

// Definition of destructor with class Connection member dependencies.
AutoConn::~AutoConn()
{
    m_pool->releaseConnection(m_connection);
}
+6
source

Use forward declaration:

class Connection {};

class ConnectionPool; //<<<<<<<<<<<<<<<forward declaration

class AutoConn {
//definitions
};

class ConnectionPool {
//definitions
};
+4
source

,

+3

:

class Connection; // no {}

class Connection {};

, .

, AutoConn, Connection?

+3

" ".

AutoConn getConn()

AutoConn - , AutoConn , . ConnectionPool AutoConn.

AutoConn ConnectionPool . ConnectionPool , ConnectionPool.

:

class Connection;
class ConnectionPool;
class AutoConn { ... };
class ConnectionPool { ... };

,

AutoConn(ConnectionPool* pool, Connection *c) : m_pool(pool), m_connection(c) {}
~AutoConn()
{
    m_pool->releaseConnection(m_connection);
}

, ConnectionPool, . , ConnectionPool. , .

class AutoConn {
  ...
  AutoConn(ConnectionPool* pool, Connection *c);
  ~AutoConn();
}
class ConnectionPool { ... };
AutoConn::AutoConn(ConnectionPool* pool, Connection *c) : ... { ... }
AutoConn::~AutoConn() { ... }
+1

, ConnectionPool AutoConn, ..

class ConnectionPool;
class AutoConn {…};

class ConnectionPool {…};

AutoConn ConnectionPool::getConn() {
}
0

ConnectionPool AutoConn. , class ConnectionPool; AutoConn.

0

All Articles