这两个函数设计的是否合理,不合理想达到同样效果,c++可以实现不
c++
class Postion{
public:
std::string x;
std::string y;
};
class PostionManage{
private:
vector<Postion> _list;
public:
void Add(const std::string* x,const std::string* y){
Postion p;
p.x = x;
p.y = y;
_list.insert(_list.end(),p);
//函数退出,P被释放,插入_list中的Postion是副本(值可以复制,如果还包含另一个对象(如Postion),Postion.Postion将会出错)
};
Postion* GetByX(const std::string* x) {
Postion* p = NULL;
vector<Postion>::it
std::vector<Postion>::iterator it;
for(it=_list.begin();it!=_list.end();++it){
if(strcmp(it->Name.c_str(),x->c_str())==0){
p = it._Ptr;
break;
}
}
return p;
//函数退出,P被释放,返回的指针不确定
};
};
class Postion{
public:
explicit Position(std::string const &px = "", std::string const &py = "") : x(px), x(py) {}
std::string x;
std::string y;
};
class PostionManage{
private:
vector<Postion> list_; //don;t use _list, because there are many compilers declare "_"(or "__"?) in front of the variables
public:
void Add(const std::string &x,const std::string &y){
//使用push_back就好了,vector是动态array,不是list
list_.push_back(Position(x, y)); //可能无法直接construct
};
//要不要回传reference你自己决定吧,如果你的函数没有改动到class内部的变数,function后面建议加const
Postion const GetByX(const std::string &x) const{
std::vector<Postion>::iterator end = list_.end();
for(std::vector<Postion>::iterator it=_list.begin(); it != end; ++it){
//std::string有内建 "=="的operator, strcmp在这里派不上用场
if(x == it->x){
return *it;
}
}
return Position("", "");
};
};
class Postion{
public:
//加个constructor会比较好, explicit是防止意外的转型
explicit Position(std::string const &px = "", std::string const &py = "") : x(px), x(py) {}
std::string x;
std::string y;
};
class PostionManage{
private:
vector<Postion> list_; //别把_放在变数前面,因为很多编译器会这么做,避免命名相冲
public:
//不必使用pointer,这种情况下pass by reference比pass by pointer好
void Add(const std::string &x,const std::string &y){
llist_.emplace_back(Position(x, y)); //直接construct,效率较高
};
Postion const GetByX(const std::string &x) const{
for(auto const &data : list_){ //比较简洁
if(x == data.x){
return data;
}
}
return Position;
};
};