读书人

这两个函数设计的是不是合理不合理想

发布时间: 2013-03-06 16:20:31 作者: rapoo

这两个函数设计的是否合理,不合理想达到同样效果,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被释放,返回的指针不确定
};
};
c++
[解决办法]
要么就GetByX返回副本, 要么就插入指针并给position加引用计数机制(直接用shared_ptr也可以)。
[解决办法]
引用:
我其实就是想在delete,update中查找共用一个方法(GetByX)来修改vector的项,碰到个作用域的问题,蛋疼死了,这种有办法不?
C/C++ code?1234567891011void Update(const std::string* x,const std::string* y){ Postion* p = GetByX(x); if(p……


不是很明白楼主的问题。“碰到个作用域的问题”是说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对此有详尽的论述

读书人网 >C++

热点推荐