1

Возможно, это очень простое решение, но в настоящее время это ошеломило меня. Итак, я пишу классы C++ к действию:Функция участника-участника без объявления класса

header.h:

#pragma once 
//... 
class arrayObj 
{ 
private: 
    // some variables... 
public: 
    //constructor, destructor, getters, etc... 
    friend void objManager::foo(); 
}; 
//... 
class objManager 
{ 
private: 
    //... 
    std::vector<std::shared_ptr<arrayObj>> array; 
public: 
    void foo(); 
    //other methods... 
}; 

Теперь, как есть, мой компилятор не найдет класс декларации objManager (или функции-члена) объявлен для включения друга. Однако с объявлением objManager, помещенным перед arrayObj, arrayObj больше не объявляется для внутреннего вектора общих указателей. Есть ли способ переслать объявление objManager в этом случае или иным способом решить эту проблему без демонтажа objManager в отдельные классы?

ответ

2

Вам необходимо переслать-объявить arrayObj, а затем поставить полное определение objManager, а затем, наконец, определение arrayObj:

class arrayObj; 

class objManager { 
    std::vector<std::shared_ptr<arrayObj>> array; // OK, fwd-declare is fine for this 

public: 
    void foo(); 

    // etc. 
}; 

class arrayObj { 
public: 
    friend void objManager::foo(); 
    // etc. 
}; 

Для того, чтобы объявить друг, что метод должен уже был видно, поэтому он должен идти первым. Перспективная декларация является следствием вектора.

+0

Это работает - спасибо. – Huntrontrakkr