1
class CDB; 

class CDM 
{ 
public: 
    friend CDB& CDB::Add(const CDM&); 
    CDM& Add(const CDB&); 
}; 

class CDB 
{ 
public: 
    CDB& Add(const CDM&); 
    friend CDM& CDM::Add(const CDB&); 
}; 

Этот код дает мне ошибку: error C2027: использование неопределенного типа «CDB». Как это решить.Есть ли способ объявить взаимные функции друга для двух классов

+0

Вы не можете. Вы должны сделать один класс полностью другом другого или сделать один класс вложенным в другое. –

+0

Чтобы создать ссылку, вам необходимо создать экземпляр объекта класса друга. Например, в CDM, вызов CDB :: Add работает над тем, что Object? Вы можете уйти от него, если функции, где статические. – Aumnayan

ответ

1

Нет, вы не можете этого сделать. Невозможно удалить циклическую зависимость.

Вы должны иметь возможность пройти класс CDB другу CDM вместо того, чтобы делать CDB::Add() знакомым.

class CDB; 

class CDM 
{ 
    public: 
     friend class CDB; 
     CDM& Add(const CDB&); 
}; 

class CDB 
{ 
    public: 
     CDB& Add(const CDM&); 
     friend CDM& CDM::Add(const CDB&); 
}; 
0

Вы можете использовать файл статическую функцию как реле:

class CDB; 
class CDM; 

static CDB& CDBAdd(CDB&, const CDM&); 

class CDM 
{ 
public: 
    friend CDB& CDBAdd(CDB&, const CDM&); 
    CDM& Add(const CDB&); 
}; 

class CDB 
{ 
public: 
    CDB& Add(const CDM& other) { 
     return CDBAdd(*this, other); 
    } 
    friend CDM& CDM::Add(const CDB&); 
    friend CDB& CDBAdd(CDB&, const CDM&); 
private: 
    CDB& doAdd(const CDM& other); // will contain the actual implementation 
}; 

CDB& CDBAdd(CDB& obj, const CDM& other) { 
    return obj.doAdd(other); 
} 

// other implementations ... 
Смежные вопросы