克隆指针矢量

时间:2016-02-23 17:33:46

标签: c++ vector clone

您好,我是新手,也是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)并且因此应该创建备份向量,因为当我再次打开服务器时,客户端需要在关闭之前切换到其状态服务器

1 个答案:

答案 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。有人必须回馈你正在分配的所有内存,否则你最终会耗尽。