如果类的数据应该被指定为该类的私有成员。 该类应提供访问所需向量方法的方法。
现在我有了我的班级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);
}
}
我正在尝试做什么?有没有更好的方法呢?对我而言,周期似乎非常无穷无尽
答案 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());