在 class 的两个对象之间使用队列

Using queue Between two object of class

为了在class的两个对象之间发送消息! 我实现了这个

class User
{
public:

    
    
     virtual void run()
    {
        while (true)
        {
            string receivedMessage = receiveMessage();
            sendMessage(receivedMessage);
        }
    }

    
     virtual void sendMessage(string message)
    {
        sentQueue.push(reply);
    };

    
     virtual string receiveMessage()
    {
        string receivedMessage;
        receivedMessage = receivedQueue.pop();
        return receivedMessage;
    };
private:
    
};

我现在要问的是在哪里实例化这个阻塞队列以在两个对象(用户 1 和用户 2)之间使用它,以便在它们之间交换消息

您有一个全局发送队列和一个全局接收队列。您需要的是每个玩家一个接收队列。

在播放器 class 上有一个发送方法可以写入他们的发送队列

所以玩家 1 会去

  player2.Send("hello player2");

怎么做

class Player
{
     BlockingQueue<string> queue_ = BlockingQueue<string>();
public:

     void Post(const string& message){
         queue_.push(message);
     }

 
virtual void run()
{
    while (true)
    {
        string msg= queue_.pop();
         // do something with the message
        if(msg == "BangBang")
        { 
        }
    }
}

现在你可以走了

Player player1("player1");
Player player2("player2");
thread thread1(&Player::run, player1);
thread thread2(&Player::run, player2);

player1.Post("BangBang");

也许你应该让你的信息更多的是一个字符串,比如

 class Message{
     Player* sender;
     string text;
     CommandType ct;
  }

或具有类似 "player1/shoot/0,5"

的字符串语法

你需要知道消息来自谁,这样你才能做出正确的反应并可能回复


或者 post 方法在发送播放器对象上调用并包含目标用户。使用我建议的消息 class

class Player
{
     BlockingQueue<Message> queue_ = BlockingQueue<Message>();
public:

     void Post(const string& message, Player *dest){
         Message msg;
         msg.sender= this; // sender 
         msg.text = message;
         dest->queue_.push(message);
     }
 
virtual void run()
{
    while (true)
    {
        Message msg= queue_.pop();
         // do something with the message
        if(msg.Text == "BangBang")
        { 
              /// check for hit
             // reply to sender
            Post("you got me", msg.sender);
        }
    }
}

现在

 Player player1("player1");
 Player player2("player2");
 thread thread1(&Player::run, player1);
 thread thread2(&Player::run, player2);

  player2.Post("BangBang", &player1); // send message to player2 (from 1)