C ++ Доступ к закрытому члену класса из другого класса с использованием геттеров - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь определить два класса, один для пользователей и один для сообщений. Класс Message будет иметь атрибут UserID для идентификации того, кто разместил сообщение, что также является атрибутом класса User.

Я следовал учебному пособию, которое делало это для ресторана (с пользователями, продуктами питания и класс Orders, состоящий из атрибутов от Users and Foods), но все атрибуты были установлены на publi c, и мое задание попросило меня сделать это с закрытыми атрибутами с getter / setters. В конце у меня есть оператор cout, который печатает атрибуты из класса Message, но атрибут, который также является частью класса User, генерирует следующие ошибки:

Ошибка C2679 двоичная '<<': не найден оператор, который принимает правый операнд типа «Пользователь» (или нет допустимого преобразования) </p>

Ошибка (активна) E0349 нет оператора «<<», совпадающего с этими операндами </p>

Если я удаляю часть msg.getUserID оператора Cout, код выполняется нормально.

Другие найденные мной вопросы касались атрибутов publi c или использовали ключевое слово Friend , Есть ли другой способ сделать это? Я попытался переместить атрибут в publi c в классе User (хотя я не могу сделать это для моего назначения), но все равно получаю те же ошибки. Я предполагаю, что это потому, что я объявил getUserID в классе Message как тип User, но я не могу найти другой способ сделать это. Я очень плохо знаком с C ++, поэтому извиняюсь, если какой-то код не самый эффективный способ сделать что-то (это обязательный модуль в моем курсе аналитики, я использовал только Python до этого момента). Любая помощь могла бы быть полезна. Спасибо!

#include <iostream>
#include <string>

using namespace std;


class User {
private:
    int userID;
    string firstName;
    string lastName;
    string email;

public:
    void setUser(int userID, string firstName, string lastName, string email) {
        this->userID = userID;
        this->firstName = firstName;
        this->lastName = lastName;
        this->email = email;
    }

    int getUserID() {
        return userID;
    }

    string getFirstName() {
        return firstName;
    }

    string getLastName() {
        return lastName;
    }


    string getEmail() {
        return email;
    }

};


class Message {
private:
    int msgID;
    User userID;
    string message;

public:
    void setMessage(string message, User userID) {
        static int msgID = 0;
            msgID++;
        this->message = message;
        this->msgID = msgID;
        this->userID = userID;
    }

     string getMessage() {
         return message;
     }

     User getUserID() {
         return userID;
     }


     int getMsgID() {
         return msgID;
     }

};

int main()
{
    User user1;
    User user2;

    user1.setUser(5, "Alice", "Smith", "alice.smith@test.com");
    user2.setUser(8, "Bob", "Jones", "bob.jones@test.com");

    Message msg1;
    Message msg2;

    msg1.setMessage("Hello this is a message", user1);
    msg2.setMessage("this is a second message", user2);
    cout << "message ID: " << msg1.getMsgID() << ", user ID: " << msg1.getUserID() << ", message: " << msg1.getMessage() << endl;
    cout << "message ID: " << msg2.getMsgID() << ", user ID: " << msg2.getUserID() << ", message: " << msg2.getMessage() << endl;

}

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Message знает только User с именем userID. Необходимо User запросить идентификатор User, поэтому измените Message

User getUserID() { // side note: This function returns a copy of userID
    return userID;
}

на

int getUserID() {
     return userID.getUserID();
} 

, который возвращает идентификатор пользователя вместо User. Имя функции всегда должно описывать, что делает функция.

И настоятельно рекомендуем изменить User userID; на что-то менее склонное к путанице. Как и функция, имя переменной должно описывать то, что представляет переменная.

Приложение

Если вам нужна функция для возврата Message содержащихся User, рассмотрите

const User & getuser() const
{
    return userID;
}

Возвращает User по ссылке и избегает копирования User. Первый const означает, что User, возвращаемый этой функцией, нельзя (легко) изменить. Второй const означает, что вызов этого метода не изменит Message. Всегда по умолчанию const до принудительного изменения. Это может предотвратить множество ошибок во время выполнения, отлавливая их во время компиляции.

0 голосов
/ 12 марта 2020

Если вы просто хотите напечатать userID элемент User, вы не можете передать весь объект в std::cout, потому что он не знает, как его распечатать.

Чтобы сделать это с минимальными изменениями в коде, просто напечатайте userID член объекта User через созданный вами геттер.

 cout << "message ID: " << msg1.getMsgID() << ", user ID: " << msg1.getUserID().getUserID() << ", message: " << msg1.getMessage() << endl;
                                                                              ^^^^^^^^^^^^^^

Живой образец

Или, если вы хотите передать весь объект в std::cout, вам потребуется перегрузить operator <<.

...