Функция-член друга без объявления класса

Вероятно, для этого есть очень простое решение, но сейчас оно меня пугает. Итак, я пишу классы 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 на отдельные классы?


person Huntrontrakkr    schedule 22.11.2014    source источник


Ответы (1)


Вам нужно объявить вперед-объявить 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.
};

Чтобы объявить друга, этот метод должен быть уже просмотрен, поэтому он должен быть запущен первым. Форвардное объявление является следствием вектора.

person Barry    schedule 22.11.2014