2015-10-04 71 views
-1

我来自Java背景,因此习惯于直接移动对象,但我在C++中遇到了问题。基本上我有一个message对象,我创建了一个循环。在该循环中,我将message对象传递给要编辑的函数并设置其值。然后我将对象返回到循环。编辑完对象后,我想将它保存到与此循环存储在同一个类中的向量中,它正在运行。如何将自定义对象存储在矢量中以便在C++中使用服务器时的存储

我面临的问题是,在循环运行几次之后,我希望我应该能够访问矢量,并有3个独立的对象具有唯一值,因为循环应该每次都创建一个新对象,但是我发现所有元素都包含与最近存储的对象相同的信息。

我猜测它与指针和参考用途有关。我已经搜索了堆栈溢出的类似问题,但目前为止没有任何帮助。这里有一些代码段:

创建消息:

void Server::handle(int client) { 
    //cout << "CONNECTED! :)\n"; 
    while (1) { 
     string request = ""; 
     Message message; 
     message.needed = false; 
     request = get_request(client); 
     if (request.empty()){break;} 
     message = parse_request(request, message); 
     //cout << "Parsed request." << "\n"; 
     if (message.needed){ 
      get_value(client, message); 
     } 
     handle_message(client, message); 
    } 
    close(client); 
} 

编辑它:

Message Server::parse_request(string request, Message message) { 
    //cout << "Parsing: " << request << "\n"; 
    //Message message; // = new Message(); 
    istringstream iss(request); 
    iss >> message.command; //store the command 
    if(message.command=="put") { 
     //cout << "put\n"; 
     iss >> message.params[0]; //store user name 
     iss >> message.params[1]; //store subject name 
     ....etc 
    } 
    return message; 
} 

最后将其存储:

bool Server::handle_message(int client, Message message){ 
    if(message.command=="put"){ 
     int count = 0; 
     for(int i=0; i<messages.size(); i++){ 
      if(messages[i].params[0] == message.params[0]){ 
       count++; 
      } 
      cout << "Message: " << message.params[1] << "\n"; 
     } 
     message.params[3] = count; 
     cout << "Stored a message for: " << message.params[0] << " with " << message.params[2] << " bytes\n"; 
     messages.push_back(message); 
     send_response(client,"OK\n"); 
    } 
} 

这里是.H:

class Message { 
    public: 
     Message(); 
     ~Message(); 
     string command; 
     string params[4]; 
     string value; 
     bool needed; 

    private: 
     bool copy(Message message); 
}; 

class Server { 
    public: 
     Server(int port, bool debugging); 
     ~Server(); 

     void run(); 

    private: 
     void create(); 
     void close_socket(); 
     void serve(); 
     void handle(int); 
     string get_request(int); 
     bool send_response(int, string); 
     Message parse_request(string, Message); 
     void get_value(int, Message); 
     bool handle_message(int,Message); 

     int port_; 
     int server_; 
     int buflen_; 
     char* buf_; 
     string requestcache; 
     string valuecache; 
     bool debug_; 
     vector<Message> messages; 
}; 
+1

如果你不想要'消息'的副本,你最好使用'std :: unique_ptr '来存储向量。 –

+2

你的'std :: vector'在哪里?请显示'消息'的声明的相关部分,所以**编辑您的问题**请 –

+0

只是为了澄清:'messages.push_back(消息)'部分将创建'消息'对象的副本存储在'消息'对象。如果你的数据不正确,我假设'Message' copy c'tor失败。 – m8mble

回答

0

我明白了。我不得不创建一个新的指针对象,然后我将从消息对象中复制所有值,并将其存储起来。此外,我意识到我有一个逻辑错误,我在引用“消息”对象而不是“消息”对象。这些修复后,代码正在运行! :)感谢帮助家伙,最大的帮助,让我能够更多地思考一些问题。

+0

习惯用法是正确定义拷贝构造函数。 – Basilevs

相关问题