Как я могу дать определение класса следующего узла класса здесь для списка с и без класса друга? - PullRequest
0 голосов
/ 08 декабря 2018

Я не уверен, правильно ли я это делаю, но как мне дать определение класса следующего узла класса здесь для списка с классом друга и без него?В каком из них я использую private: или public:?

Без класса друга:

class node { 
public:
    el_t Elm; 
    Node *Next; 
}

С классом друга:

class node { 
private:
    el_t Elem; 
    Node* Next;
}

1 Ответ

0 голосов
/ 08 декабря 2018

friend - это спецификатор, который предоставляет конкретной функции или самому классу доступ к ее защищенным, а также закрытым членам и методам:

class SomeFriend;

class SomeClass
{
public:
    SomeClass(int a, int b, int c) : a_(a), b_(b), c_(c) {}
    virtual ~SomeClass();
private:
    int a_, b_, c_;
    friend SomeFriend;
};

class SomeFriend
{
public:
    virtual ~SomeFriend();
    int AddABC(SomeClass& b) { return b.a_ + b.b_ + b.c_; }
};

Чем же тогда отличается от наследования?

friend членам требуется внешний экземпляр базового класса для доступа к его членамв то время как производный класс уже сам является экземпляром базового класса ...

Что еще можно улучшить в приведенном выше коде?

Вы можете переместить объявлениекласса SomeFriend выше SomeClass ... и просто выполните:

class SomeClass;

class SomeFriend
{
public:
    virtual ~SomeFriend();
    int AddABC(SomeClass& b);
};

class SomeClass
{
public:
    SomeClass(int a, int b, int c) : a_(a), b_(b), c_(c) {}
    virtual ~SomeClass();
private:
    int a_, b_, c_;
    // Making only the member function 'AddABC' friend of this class...
    friend int SomeFriend::AddABC(SomeClass& b);
};

int SomeFriend::AddABC(SomeClass& b)
{
    return b.a_ + b.b_ + b.c_;
}

Здесь вы не делаете класс friend, а выполняете специальную функциюэто требует только своих частных и защищенных членов ...

...