您好,我是新手,也是C ++新手。我有一个问题,我需要制作我的指针向量的备份副本。但我无法正确地做到这一点。我在这个论坛上找到了我的案例的解决方案,但不能正确地做到:
<context:annotation-config />
我尝试在我的代码中实现这一点,但无法获得良好的解决方案,任何人都可以帮我解决这个问题吗?
我的代码:
sever.cpp
class cloneFunctor {
public:
T* operator() (T* a) {
return a->clone();
}
}
server.h
#include "server.h"
#include <iostream>
#include <functional>
#include <algorithm>
#include <iterator>
class Client;
class cloneFunctor {
public:
cloneFunctor* operator() (cloneFunctor* a) {
return a->clone();
}
};
Server *Server::instance = 0;
Server& Server::getInstance() {
if (instance == 0)
instance = new Server();
return (*instance);
}
void Server::setStatus(bool status) {
this->nStatus = status;
changeClientStatus();
writeStateToConsole();
}
bool Server::getStatus() {
return nStatus;
}
void Server::writeStateToConsole() {
std::cout << "Server state: " << getStatus() << std::endl;
}
void Server::subscribeToServer(Client &temp) {
listOfClients.push_back(&temp);
}
void Server::writeClients() {
for (unsigned int i = 0; i < listOfClients.size(); i++) {
std::cout << i+1 << ". client status: " << listOfClients[i]->getStatus() << std::endl;
}
}
void Server::changeClientStatus() {
if (nStatus == 0){
makeCopy(listOfClients);
for (unsigned int i = 0; i < listOfClients.size(); i++) {
listOfClients[i]->setStatus(false);
}
}
else
restoreCopy();
}
void Server::makeCopy(std::vector<Client *>listOfClients) {
transform(listOfClients.begin(), listOfClients.end(), back_inserter(listOfClientsOld), cloneFunctor());
}
void Server::restoreCopy() {
}
程序应该创建单例服务器类,然后创建3个将服务器加载到服务器的客户端(这些客户端保存在指针向量中)。当我将服务器状态设置为0时,所有客户端都将其状态更改为关闭(bool false)并且因此应该创建备份向量,因为当我再次打开服务器时,客户端需要在关闭之前切换到其状态服务器
答案 0 :(得分:0)
Client
可能需要一个赋值运算符
Client & operator=(Client & toCopy)
{
// copy all of toCopy's members over to this
}
如果它还没有,并且包含您不能信任自动复制的指针或复杂数据类型。
现在你可以轻松
clientA = clientB;
将clientB
复制到clientA
然后我们进入主赛事Server::restoreCopy()
,这是一个残酷的简单变体:
if (listOfClients.size() != listOfClientsOld.size())
{
// back up is stale. Probably throw exception
}
for (size_t index = 0; index < listOfClients.size(); index++)
{
*listOfClients[index] = *listOfClientsOld[index];
}
这些是vector
指针,因此您必须取消引用(*
)指针以获取指向Client
的指针,或者复制指针而不是指向的指针。请记住,Client
的克隆是完全不同的Client
,而不是Server
用户首先传入的内容。如果Server
用户仍然持有初始Client
并使用它,那么如果您只复制指针,则会发生糟糕的问题。双方将在不同的Client
上运作,即使它们看起来可能相同。一次修改就像他们一样
您也可以使用用于备份的std::transform
技巧,但这很简单明了且易于调试。随意使用迭代器和基于范围的for
。
当你做到这一点时,祈祷没有人重新排序listOfClients
因为你做了备份。
重要的附注:
void makeCopy(std::vector<Client *>listOfClients);
很奇怪。它允许Server
用户传入自己的vector
并添加到任何现有的备份中。这包括Server
本身。它不会删除任何现有备份,因此listOfClientsOld
会继续增长。而且因为任何有权访问Server
的人都可以调用它并传入他们自己的vector
,所以他们可以填补那些充满了谬误的废话。我建议makeCopy
不带任何参数,并从备份中删除任何现有Clients
,并delete
。更好的是,listOfClientsOld
根本不需要存储指针,可能不应该存在。
游戏中有很多指针而没有delete
。有人必须回馈你正在分配的所有内存,否则你最终会耗尽。