@ivan8m8

Как перестроиться с публичных данных в классе на приватные?

Есть такой код C++:
#include <iostream>
#include <string.h>

using namespace std;

// Одно звено очереди
class Node {
public:
    string login;
    string password;
    Node *Next;
};

class Queue {
    Node *Head, *Tail; // Указатели на начало и конец очереди
public:
    Queue(); // Конструктор
    ~Queue(); // Деструктор
    void Add(string login, string password);
    void Show();
};

// Значения по умолчанию
Queue::Queue() {
    Head = Tail = NULL;
}

// Освобождение памяти
Queue::~Queue() {
    Node *temp = Head;
    while (temp != NULL) {
        temp = Head->Next;
        delete Head;
        Head = temp;
    }
}

void Queue::Add(string login, string password) {
    Node *temp = new Node;
    temp->login = login;
    temp->password = password;
    temp->Next = NULL;
    if (Head != NULL) {
        Tail->Next = temp;
        Tail = temp;
    } else {
        Head = Tail = temp;
    }
}

void Queue::Show() {
    Node *temp = Head;
    while (temp != NULL) {
        cout << temp->login;
        cout << ";";
        cout << temp->password;
        cout << endl;
        temp = temp->Next;
    }
    cout << endl;
}

int main()
{
    Queue o;
    o.Add("s","ss");
    o.Add("1","op");
    o.Add("l","p");
    o.Show();
    return 0;
}


Есть два класса, Node - это один элемент очереди. Queue - сама очередь.

Меня заставляют сделать так:
class Node {
private:
    string login;
    string password;
    Node *Next;
};


Но как мне записывать логины и пароли в Node, если они там приватные?
Поясните, пожалуйста, на моём примере. (Что там слышал про дружественные функции, но на практике в этом примере не получилось)

P.S. Обязательно, чтобы было 2 класса.
  • Вопрос задан
  • 2949 просмотров
Пригласить эксперта
Ответы на вопрос 5
AMar4enko
@AMar4enko
getLogin(), setLogin(value), getPassword(), setPassword(value)
Ответ написан
@vdem
void Add(Node node);
1. Почему у Узла нет конструктора?
Node::Node(string aLogin, string aPassword) {
    login = aLogin;
    password = aPassword;
}

2. Зачем Очереди знать о приватных полях (и вообще каких-либо полях) Узла? Это ей чем-то поможет?

UPD: Делайте НЕСПЕЦИАЛИЗИРОВАННУЮ очередь. Я не вижу смысла ее привязывать к логину/паролю.

UPD2: Пара логин/пароль ОДНОГО пользователя совсем не должна знать о СЛЕДУЮЩЕМ пользователе.
Ответ написан
Комментировать
@xandox
я вам возможно сейчас жизнь сломаю, но вот вам
#include <string>
#include <utility>
#include <iostream>

class CredentialsInfo {
    std::string _login, _password;

public:
    CredentialsInfo() {}
    CredentialsInfo(const std::string& login, const std::string& password)
        : _login(login)
        , _password(password)
    { }

public:
    std::string Login() const {
        return _login;
    }

    std::string Password() const {
        return _password;
    }

    void SetLogin(const std::string& newLogin) {
        _login = newLogin;
    }

    void SetPassword(const std::string& newPassword) {
        _password = newPassword;
    }

    friend std::ostream& operator<<(std::ostream&, const CredentialsInfo&);
};

std::ostream& operator<<(std::ostream& out, const CredentialsInfo& info) {
    return out << info._login << "; " << info._password;
}

template <class DataClass>
class Queue {
public:
    typedef DataClass   value_type;

private:
    struct QueueNode {
        value_type Value;
        QueueNode* Next;

        QueueNode(value_type&& value)
            : Value(std::move(value))
            , Next(nullptr)
        { }
    };

    QueueNode *_head, *_tail;

public:
    Queue()
        : _head(nullptr)
        , _tail(nullptr)
    { }

    ~Queue() {
        while(_head) {
            auto tmp = _head;
            _head = _head->Next;
            delete tmp;
        }
    }

public:
    template <class Data>
    void Add(Data&& data) {
        auto* newNode = new QueueNode(std::forward<Data>(data));
        if (_head) {
            _tail->Next = newNode;
            _tail = newNode;
        } else {
            _head = _tail = newNode;
        }
    }

    template<class... Args>
    void Add(Args&&... args) {
        Add(value_type(std::forward<Args>(args)...));
    }

    void Show(std::ostream& out) const {
        auto it = _head;
        while (it) {
            out << it->Value << '\n';
            it = it->Next;
        }
        out.flush();
    }
};

typedef Queue<CredentialsInfo> CredentialsQueue;

int main(int, char**) {
    CredentialsQueue queue;

    queue.Add("s", "ss");
    queue.Add("1", "op");
    queue.Add("1", "p");
    queue.Show(std::cout);
    return 0;
}
Ответ написан
Комментировать
AxisPod
@AxisPod
Класс имеет доступ ко всем своим членам, даже к приватным, friend тут не нужен вообще. Свойства язык не поддерживает, поэтому работа ведется с set/get методами. Переменные делаются "почти всегда" (читать всегда) приватными и делаются публичные методы set/get по необходимости.
Ответ написан
Комментировать
@ivan8m8 Автор вопроса
Попробовал переписать класс с Вашими указаниями:

class Node {
    string login;
    string password;
    Node *next;
public:
    void setLogin(string newLogin);
    void setPassword(string);
    void getLogin();
};

Node::Node(string aLogin, string aPassword) {
    login = aLogin;
    password = aPassword;
}

void setLogin(string newLogin) {
    Node temp;
    temp.login= newLogin;
}


Ругается:
1) /main.cpp:16: ошибка: out-of-line definition of 'Node' does not match any declaration in 'Node'
Node::Node(string aLogin, string aPassword) {
^~~~

2) main.cpp:23: ошибка: 'login' is a private member of 'Node'
temp.login= newLogin;
^

Так и не получилось у меня положить данные в приват...
Поможите? Только начал ООП.Попробовал переписать класс с Вашими указаниями:

class Node {
    string login;
    string password;
    Node *next;
public:
    void setLogin(string newLogin);
    void setPassword(string);
    void getLogin();
};

Node::Node(string aLogin, string aPassword) {
    login = aLogin;
    password = aPassword;
}

void setLogin(string newLogin) {
    Node temp;
    temp.login= newLogin;
}


Ругается:
1) /main.cpp:16: ошибка: out-of-line definition of 'Node' does not match any declaration in 'Node'
Node::Node(string aLogin, string aPassword) {
^~~~

2) main.cpp:23: ошибка: 'login' is a private member of 'Node'
temp.login= newLogin;
^

Так и не получилось у меня положить данные в приват...
Поможите? Только начал ООП.Попробовал переписать класс с Вашими указаниями:

class Node {
    string login;
    string password;
    Node *next;
public:
    void setLogin(string newLogin);
    void setPassword(string);
    void getLogin();
};

Node::Node(string aLogin, string aPassword) {
    login = aLogin;
    password = aPassword;
}

void setLogin(string newLogin) {
    Node temp;
    temp.login= newLogin;
}


Ругается:
1) /main.cpp:16: ошибка: out-of-line definition of 'Node' does not match any declaration in 'Node'
Node::Node(string aLogin, string aPassword) {
^~~~

2) main.cpp:23: ошибка: 'login' is a private member of 'Node'
temp.login= newLogin;
^

Так и не получилось у меня положить данные в приват...
Поможите? Только начал ООП.Попробовал переписать класс с Вашими указаниями:

class Node {
    string login;
    string password;
    Node *next;
public:
    void setLogin(string newLogin);
    void setPassword(string);
    void getLogin();
};

Node::Node(string aLogin, string aPassword) {
    login = aLogin;
    password = aPassword;
}

void setLogin(string newLogin) {
    Node temp;
    temp.login= newLogin;
}


Ругается:
1) /main.cpp:16: ошибка: out-of-line definition of 'Node' does not match any declaration in 'Node'
Node::Node(string aLogin, string aPassword) {
^~~~

2) main.cpp:23: ошибка: 'login' is a private member of 'Node'
temp.login= newLogin;
^

Так и не получилось у меня положить данные в приват...
Поможите? Только начал ООП.Попробовал переписать класс с Вашими указаниями:

class Node {
    string login;
    string password;
    Node *next;
public:
    void setLogin(string newLogin);
    void setPassword(string);
    void getLogin();
};

Node::Node(string aLogin, string aPassword) {
    login = aLogin;
    password = aPassword;
}

void setLogin(string newLogin) {
    Node temp;
    temp.login= newLogin;
}


Ругается:
1) /main.cpp:16: ошибка: out-of-line definition of 'Node' does not match any declaration in 'Node'
Node::Node(string aLogin, string aPassword) {
^~~~

2) main.cpp:23: ошибка: 'login' is a private member of 'Node'
temp.login= newLogin;
^

Так и не получилось у меня положить данные в приват...
Поможите? Только начал ООП.Попробовал переписать класс с Вашими указаниями:

class Node {
    string login;
    string password;
    Node *next;
public:
    void setLogin(string newLogin);
    void setPassword(string);
    void getLogin();
};

Node::Node(string aLogin, string aPassword) {
    login = aLogin;
    password = aPassword;
}

void setLogin(string newLogin) {
    Node temp;
    temp.login= newLogin;
}


Ругается:
1) /main.cpp:16: ошибка: out-of-line definition of 'Node' does not match any declaration in 'Node'
Node::Node(string aLogin, string aPassword) {
^~~~

2) main.cpp:23: ошибка: 'login' is a private member of 'Node'
temp.login= newLogin;
^

Так и не получилось у меня положить данные в приват...
Поможите? Только начал ООП.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы