Форвардное объявление только говорит компилятору "такой класс существует". В вашем
AutoConn getConn()
, поскольку AutoConn
является типом значения, должна быть известна вся структура AutoConn
, поэтому предварительное объявление класса не будет работать. Таким образом, вы должны поставить фактическую декларацию AutoConn
перед ConnectionPool
.
В вашем 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() { ... }