C++ 使用 getters 从另一个 class 访问一个 class 的私有成员

C++ Accessing a private member of a class from another class using getters

我正在尝试定义两个 classes,一个用于用户,一个用于消息。 Message class 将有一个属性 UserID 来标识谁发布了消息,这也是 User class.

的一个属性

我遵循了一个为餐厅做这个的教程(用户、食品和订单 class 由用户和食品的属性组成)但属性都设置为 public 并且我的任务要求我使用带有 getters / setters 的私有属性来执行此操作。 最后,我有一个 cout 语句,它打印 Message class 中的属性,但也是 User class 的一部分的属性生成以下错误:

Error C2679 binary '<<': no operator found which takes a right-hand operand of type 'User' (or there is no acceptable conversion)

Error (active) E0349 no operator "<<" matches these operands

如果我删除 Cout 语句的 msg.getUserID 部分,代码运行正常。

我发现的这个问题的其他实例与 public 属性相关,或者使用了 Friend 关键字。还有其他方法吗?我已经尝试将属性移动到用户 class 中的 public (尽管我不能为我的任务执行此操作)但我仍然遇到相同的错误。我假设这是因为我在 Message class 中将 getUserID 声明为 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;

}

Message只知道名为userIDUser。它需要向 User 询问 User 的 ID,因此更改 Message

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

进入

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

其中 return 是用户 ID 而不是 User。函数名称应始终描述函数的作用。

并强烈考虑将 User userID; 更改为不易引起混淆的内容。像函数一样,变量的名称应该描述变量代表什么。

附录

如果您发现自己需要 return Message 包含 User 的函数,请考虑

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

这 return 通过引用引用 User 并避免复制 User。第一个 const 表示无法(轻松)更改从此函数编辑的 User return。第二个const表示调用这个方法不会改变Message。始终默认为 const 直到被迫更改。这可以通过在编译时捕获它们来防止很多运行时错误。

如果您只想打印 UseruserID 成员,则不能将整个对象传递给 std::cout,因为它不知道如何打印它。

您可以通过在代码中进行最少的更改来执行此操作的方法是仅通过您创建的 getter 打印 User 对象的 userID 成员。

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

Live sample

或者,如果您想将整个对象传递给 std::cout,您将需要重载 operator <<