我如何使用智能ptrs编写以下内容:
public class PlacesAdapter extends BaseRecyclerAdapter<PlacesAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView;
public ViewHolder(View v){
super(v);
mTextView= (TextView) v.findViewById(R.id.info_text);
}
}
public PlacesAdapter(RecyclerView recyclerView){
super(recyclerView);
}
@Override
public int getItemCount() {
return 0;
}
@Override
public void setDataSet( String data) {
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//This says Method does not override method from its suplerclass
}
}
我最感兴趣的是方法参数和返回技巧...... 这样的东西是正确的吗?
class App
{
public:
Project* GetProject();
SetProject( Project* project );
private:
Project* project;
}
Project* project = new Project();
App* app = new App();
app.SetProject( project );
Project* retrievedProject = app.GetProject();
这与此问题有关:Should i stop using * pointers? - A few entry questions
我对现在的规则感到有些困惑......提前致谢!
编辑小问题:
Galik ,你曾经提到很少想要在函数调用之外声明Project然后将其传递给release ...我有以下内容(例如):
class App
{
public:
void App::SetProject( unique_ptr<Project> project )
{
this->project.swap( project );
}
Project* App::GetProject() const
{
return this->project.get();
}
private:
unique_ptr< Project > project;
}
...
unique_ptr< Project > project( new Project() );
unique_ptr< App > app( new App() );
app.SetProject( project );
unique_ptr< Project > retrievedProject = app.GetProject();
这完全正常吗?我的问题是,我实际上正在为游戏创建工具,我担心随着垃圾收集的进行,不断标记删除会导致微小的口吃......我只是为了担心而担心?
答案 0 :(得分:1)
以下是unique_ptr
#include <iostream>
#include <memory>
struct Project
{
~Project()
{
std::cout << "Destructor..." << std::endl;
}
};
class App
{
std::unique_ptr<Project> _uptr;
public:
// set _uptr to nullptr by default
App(std::unique_ptr<Project> uptr = nullptr): _uptr(std::move(uptr)){}
std::unique_ptr<Project> GetProject()
{
return std::move(_uptr);
};
void SetProject(std::unique_ptr<Project> project)
{
// need std::move, unique ownership
_uptr = std::move(project);
};
};
int main()
{
std::unique_ptr<Project> project(new Project);
std::unique_ptr<App> app(new App);
// need std::move, unique ownership
app->SetProject(std::move(project));
}
答案 1 :(得分:1)
这个问题的答案实际上取决于你想要做什么。您应该使用智能指针来表达所有权,如果您可以提供任何帮助,那么您不应该通过智能指针。
如果例如,您的App
类应该处理各种Project
对象,并且仅向<{1>提供访问对于局外人,那么你应该通过将引用返回给项目来表达。
通过这种方式,多个呼叫者可以访问Project
拥有的内部Project
。
相反:
App