这两个函数设计的是否合理,不合理想达到同样效果,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被释放,返回的指针不确定
};
};
[解决办法]
要么就GetByX返回副本, 要么就插入指针并给position加引用计数机制(直接用shared_ptr也可以)。
[解决办法]
不是很明白楼主的问题。“碰到个作用域的问题”是说GetByX的调用吗?这种非static成员函数只能通过class的对象进行访问。
[解决办法]
你把c和c++的风格混在一起了,写出了很奇怪的代码
不是不能把这两者混在一起,但是要混的合理
强烈建议你去拜读c++ primer 5,否则你以后有很大的机会抱怨
“为何c++那么烂?”,“c++不灵验”,"c++很慢"之类的
这种人我见过不只一个了
c++98
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("", "");
};
};
c++11
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;
};
};
我没有编译过,大体就是这样写的
如果配合c++11的move constructor和move assignment,你的程式
效率会变得更高,c++ primer5对此有详尽的论述