【发布时间】:2016-06-05 16:35:01
【问题描述】:
您好,我是新来的,也是 C++ 的新手。我有一个问题,我需要制作我的指针向量的备份副本。但我不能正确地得到它。我在这个论坛上找到了我的案例的解决方案,但无法正确解决:
class cloneFunctor {
public:
T* operator() (T* a) {
return a->clone();
}
}
我试图在我的代码中实现这一点,但无法很好地解决,谁能帮我解决这个问题?
我的代码:
服务器.cpp
#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() {
}
服务器.h
#ifndef SERVER_H_
#define SERVER_H_
#include "abstractbaseclass.h"
#include "server.h"
#include "client.h"
class Client;
class Server : public Abstractbaseclass {
friend class Client;
public:
static Server& getInstance();
virtual void setStatus(bool status);
virtual bool getStatus();
virtual void writeStateToConsole();
void subscribeToServer(Client &temp);
void writeClients();
void changeClientStatus();
void makeCopy(std::vector<Client *>listOfClients);
void restoreCopy();
private:
static Server *instance;
Server(){};
std::vector <Client *>listOfClients;
std:: vector <Client *> listOfClientsOld;
};
#endif /* SERVER_H_ */
程序应该创建单例服务器类,然后创建 3 个将订阅服务器的客户端(这些客户端保存在指针向量中)。当我将服务器状态设置为 0 时,所有客户端都将其状态更改为关闭(bool false)并且在这之前应该创建备份向量,因为当我再次打开服务器时,客户端需要从关闭服务器之前切换到它们的状态。
【问题讨论】:
-
如果在服务器未运行时未修改客户端,您将做很多额外的工作。从概念上讲,最好不要保留向量的副本,而是让
Clients负责备份和恢复自己。这使服务器变得非常愚蠢,并使服务器更难通过复制或替换客户端的状态来任意搞砸它。 -
这其实不是我的主意怎么解决,这是我们老师想要的,所以我必须处理它,并且“实现他的愿望”