我应该从静态成员方法中 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;
};
我主要来自 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;
};