我应该从静态成员方法

时间:2015-08-19 13:10:12

标签: c++ oop pointers static-methods static-members

我主要来自Java世界,但最近一直在编写一堆c ++,但仍然没有很好地理解如何使用指针或使用什么类型的指针。我将举一个关于我的案例的简短例子,并记住我真正要问的问题是,“我应该使用什么类型的指针以及为什么?”。

与我的代码完美平行的是考虑链接的类。每个链接都有一个父链接,但根链接只能是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 ++中我不知道如何管理对静态对象指针的需求。在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

Link*没问题,并且恰好有一个类(static)也没关系 - 它仍然只是指向Link对象的指针。

答案 1 :(得分:2)

我使用它(因为它在标题中是无法使用的):

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允许解构程序在程序结束时运行。如果你知道你不需要解构函数,那么普通的旧指针也可以。

答案 2 :(得分:1)

我建议您返回std::unique_pointer<Link>std::shared_pointer<Link>或(在C ++ 11之前)std::auto_ptr<Link>

您可以返回原始指针,但您必须分别管理指针(以及它们指向的对象的生命周期)。由于Java为您做了清理 - 而Java开发人员经常鼓励您不要担心这些事情 - 您通常不会有理智地管理这些事情。

答案 3 :(得分:1)

我不明白它为什么会返回一个指针。我希望createRootLink()返回按值,getRootLink()返回引用。

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;
};