在类之间复制私有向量

时间:2011-08-31 09:58:33

标签: c++ vector private

如果类的数据应该被指定为该类的私有成员。 该类应提供访问所需向量方法的方法。

现在我有了我的班级Snake,它为经典游戏封装了一条蛇。

typedef std::vector<Polygon4>::const_iterator const_iterator;
enum directions{UP, DOWN, RIGHT, LEFT, IN, OUT, FW, RW };

class Snake
{
private:
    enum directions head_dir;
    int cubes_taken;
    float score;
    struct_color snake_color;
    V4 head_pos;
    std::vector<Polygon4> p_list; //the vector
public:   

    Snake();
    V4 get_head_pos();
    Polygon4 create_cube(V4 point);
    void initialize_snake();
    void move(directions);

    void set_head_dir(directions dir);
    directions get_head_dir();
    void sum_cubes_taken(int x);
    int get_cube_taken();

    void sum_score(float x);
    float get_score();

    void set_snake_color();

 //vector manipulation functions
 const_iterator p_list_begin() const {return p_list.begin();}
 const_iterator p_list_end() const {return p_list.end();}
 void add_IntToP_list(Polygon4 cube){p_list.push_back(cube);}
 void clear_list(){p_list.clear();}
 unsigned int get_list_size(){return p_list.size();}

};

我的程序中有另一个类,图形管理:

class MyGLBox{
private:
std::vector<Polygon4> p_list;
public:
     //do stuff...
     //management vectors:
     const_iterator p_list_begin() const {return p_list.begin();}
     const_iterator p_list_end() const {return p_list.end();}
     void add_IntToP_list(Polygon4 cube){p_list.push_back(cube););
     void clear_list(){p_list.clear();}
     unsigned int get_list_size(){return p_list.size();}
}

现在游戏中的每一帧我都需要将蛇p_list复制到MyGLbox p_list中。如果向量是公开的,那将非常简单:

myGLBox.p_list = snake.p_list;

现在如果他们是私人的话:

transfer_function(*MyGLBox box, *Snake snake){
    const_iterator cube;
    for(cube = snake->p_list_begin(); cube != snake->p_list_end(); cube++){
         box->add_InTop_list(*cube);
    }
}

我正在尝试做什么?有没有更好的方法呢?对我而言,周期似乎非常无穷无尽

4 个答案:

答案 0 :(得分:0)

您可以尝试使用友元功能:

void transfer_function(MyGLBox * box, Snake * snake )
{
    box->p_list = snake->p_list;
}

// in class MyGlBox
friend void transfer_function(MyGLBox *, Snake *);

// in class Snake
friend void transfer_function(MyGLBox *, Snake *);

但是如果你有多个这样的场景,这很容易变得无法管理。

或者,您仍然可以通过get成员直接公开向量。 E.g:

// in class MyGLBox
std::vector<Polygon4> & get_p_list( )
{
    return p_list;
}

如果你返回矢量本身并不一定总是“坏” - 因为你无论如何暴露了很多矢量的功能,它不像用户被给予了对数据的不必要的控制。

答案 1 :(得分:0)

很明显,友谊违反了编程练习。我认为你的方法是正确的,它提供了私有向量的访问器,我同意,复制所有数据是低效的。您可以做的一个优化是扩展矢量:

v.reserve(v.size() + distance(v_prime.begin(),v_prime.end()));
v.insert(v.end(),v_prime.begin(),v_prime.end());

我从here抢了代码。

答案 2 :(得分:0)

你有很多方法可以做到这一点。一种方法是friend您的其他功能,以便它可以像公共变量一样访问您的vector

另一个是使变量本身public。有些人可能认为这不是好习惯等,但这太荒谬了。你是想从自己身上“保护”vector吗?你对自己的编程有多自信?对我来说,制作private只会在你为其他人编写图书馆时使用,而不是在你自己的程序中使用。

最后,关于你说的话。你提出的for循环根本不是低效的。 效率低于使用=的效果,但是,逐个添加也不是那么糟糕。 vector的摊销效果为O(1)。实际上,如果插入某些内容的费用为1,则向量中添加已分摊费用2

答案 3 :(得分:0)

如果您已有功能

void add_IntToP_list(Polygon4 cube){p_list.push_back(cube););

用于添加单个元素,您可以添加另一个重载来添加一系列元素

void add_IntToP_list(vector<Polygon4>::const_iterator first, 
                      vector<Polygon4>::const_iterator last)
{ p_list.insert(p_list.end(), first, last); }

然后使用您要添加的范围调用它,也许

box->add_IntToP_list(snake->p_list_begin(), snake->p_list_end());