C++: предоставить доступ частному оператору, "проходящему" через класс друга, возможно?

Допустим, я определил эти два класса:

class Node
{
    friend class list;

public:
    Node (const int = 0);
    Node (const Node &);

private:
    int val;
    Node * next;
    Node & operator=  (const Node &);
};


class list
{
public:
    list ();                                
    list (const list &);                    
    ~list ();                              

    list & operator+= (const Node &);
    Node & operator[] (const int) const;    

private:
    list & delete_Node (const int);
    Node * first;
    int length;
};

а затем, в течение main.cpp файл, у меня есть эти строки:

list l1;

l1 += 1;
l1 += 41;
l1[1] = 999;    // <-- not permitted: Node::operator= is private

Мой вопрос: возможно ли предоставить доступ к Node::operator= если и только если lvalue является ссылкой в ​​списке (который является классом друга Node) даже если main() это не функция друга?

1 ответ

Решение

Это не будет работать, но это будет:

class Node
{
    friend class list;

public:
    Node (const int = 0);
    Node (const Node &);

private:
    int val;
    Node * next;
    Node & operator=  (const Node &);
};

class Magic
{
public:
    operator Node&() { return node; }
    Node& operator=(int v) { return list::assign(node, v); }

private:
    friend class list;
    Magic(Node& n) : node(n) {}
    Node& node;
};

class list
{
public:
    Magic operator[] (int) const { return const_cast<Node&>(*first); }

private:
    static Node& assign(Node& n, int v) { n.val = v; return n; }
};

А теперь забудь, что ты когда-либо видел это, потому что в любом случае это очень плохой дизайн.

Другие вопросы по тегам