我应该从静态成员方法中 return 什么类型的指针

What type of pointer should I return from static member method

我主要来自 Java 的世界,但最近一直在编写大量 C++,但仍然不太了解如何使用指针或在何处使用哪种类型的指针。我将简要举例说明我的情况,并记住我真正要问的问题是 "What type of pointer should I use and why?"。

与我的代码完美平行的是考虑链 link 的 class。每个 link 都有一个父 link,除了根 link 只能有 1 个

// Link.hpp
class Link
{
public:
    Link(const std::string &linkName, Link *parentLink);
    Link(const std::string &linkNam);
    static Link* createRootLink(const std::string &linkName);
    static Link* getRootLink();

private:
    static Link *rootLink;
    Link *parentLink;
}

//Link.cpp
Link* Link::rootLink = Link::createRootLink("root");

Link* Link::createRootLink(const std::string &linkName);
{
    // Is raw pointer correct here or should I 
    // use a different pointer type, i.e. smart_pointer, 
    // shared_pointer, etc?
    Link *rootLink = new Link(linkName); 
    return rootLink;
}

Link* getRootLink()
{
     return rootLink;
}

Link::Link(const std::string &linkName)
{
    this->linkName = linkName;
    this->parentLink = NULL; // Root link has no parent link.
}

Link::Link(const std::string &linkName, Link *parentLink)
{
    this->linkName = linkName;
    this->parentLink = parentLink;
}

希望这已经足够清楚了。我 Java 这种事情很简单,但是在 c++ 中我不确定如何管理对静态对象指针的需求。在此先感谢您的帮助!

A Link* 很好,class (static) 正好有一个并不重要——它仍然只是指向 Link对象。

我用这个(因为它在 header 中是内联的):

class Link
{
public:
    Link(const std::string &linkName, Link *parentLink);
    Link(const std::string &linkNam);
    static Link* getRootLink() {
        static std::unique_ptr<Link> root(new Link("root"));
        return root.get();
    }
};

在单线程环境中,这很好,在多线程环境中,您需要防止多个线程首次同时访问 getRootLink(有一个保护模式可以启用此功能。)

请注意 unique_ptr 允许解构函数在程序结束时 运行。如果你知道你不需要解构器,一个普通的旧指针也可以。

我建议 return 使用 std::unique_pointer<Link>std::shared_pointer<Link> 或(在 C++11 之前)std::auto_ptr<Link>

您可以 return 原始指针,但您必须单独管理指针(以及它们指向的对象的生命周期)。由于 Java 会为您进行清理 - 并且 Java 开发人员经常鼓励您不要担心此类事情 - 您通常不会有明智地管理此类事情的心态。

我完全不明白为什么它 return 是一个指针。我希望 createRootLink() 到 return 按值和 getRootLink() 到 return 参考。

class Link
{
public:
    Link(const std::string& name, Link& parent) : name(name), parent(&parent) {}
    Link(const std::string& name) : name(name), parent(nullptr) {}

    static Link createRootLink(const std::string& name)
    {
        return Link(name);
    }

    static Link& getRootLink() 
    {
         static Link rootLink = createRootLink("root");
         return rootLink;
    }

private:
    std::string name;
    Link *parent;
};