有人可以为我提供一个设置和检索unique_ptr的简单示例

时间:2015-05-01 01:14:36

标签: c++ pointers c++11

我如何使用智能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();

这完全正常吗?我的问题是,我实际上正在为游戏创建工具,我担心随着垃圾收集的进行,不断标记删除会导致微小的口吃......我只是为了担心而担心?

2 个答案:

答案 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