我对此进行了大量搜索。但可能是我没有得到正确的措辞。
考虑一下,
Class A {};
Class B {
public:
A* getA();
void setA(A *aVarParam);
private:
A *aVar;
};
现在,因为aVar是B类的成员变量,所以我希望确保只要B类的相应对象存在,它就会保持活动状态。
所以我在这里看到的选项是,
这两者似乎都是太多的工作或丑陋的语法。我在这里错过了什么吗?所有C ++程序都使用这两个选项之一吗?
更多说明:
好的,很多人都希望看到我如何使用它的一个例子。实际上我想要一个通用策略的答案。因此,原始的例子。以下是我尝试使用的示例:
#ifndef DBSCHEMA_H
#define DBSCHEMA_H
#include <string>
#include <vector>
#include "dbtable.h"
namespace models {
class DbSchema
{
public:
explicit DbSchema();
boost::shared_ptr<std::string> getSchemaName() const;
void setSchemaName(const boost::shared_ptr<std::string> schemaName);
std::vector<models::DbTable> getTableList() const;
void setTableList(const std::vector<models::DbTable> tableList);
private:
boost::shared_ptr<std::string> schemaName_;
std::vector<models::DbTable> tableList_;
};
}
#endif // DBSCHEMA_H
这里的类DbSchema被用作指导UI(A QT应用程序)的瘦模型。并且将有许多Schema Builders实际上将与不同的数据库通信以填充UI将使用的DBSchema对象。
我希望这可以解决我想要实现的目标。我不是C ++程序员。在编写Java,Objective-C,PHP和JavaScript多年之后,我试图满足于编写“真正的C ++”应用程序。
答案 0 :(得分:4)
为了这个问题,我假设你有一个存储指针的真正原因,而不是对象本身。但是,如果您的实际代码与示例类似,则没有充分的理由将指针存储到字符串。
第三种选择是取得对象的所有权。在C ++ 11之前,这很难实现,没有泄漏或悬挂指针的危险,但是现在我们已经移动了语义和unique_ptr
,这是一个处理单个可转让所有权语义的智能指针。
#include <memory>
class B {
public:
void setA(std::unique_ptr<A> aVarParam) {
aVar = std::move(aVarParam);
}
private:
std::unique_ptr<A> aVar;
};
std::unique_ptr<A> myA(new A);
assert(myA); // we own the object
b.setA(std::move(myA)); // transfer ownership
assert(!myA); // we no longer own it
答案 1 :(得分:3)
如果你想要B拥有对象A那么它就不清楚了 对于在
之类的函数之后拥有该对象的用户 A* getA();
谁应该删除该对象?
即使使用shared_ptr
还有其他语法
会让你的班级用户明白谁拥有
对象
std::shared_ptr<A> getA();
如果您想要将对象传递给其他人
请改用std::unique_ptr
。
没有太多的开销添加这个并且它使 您的代码更易于阅读。
答案 2 :(得分:3)
我认为你需要回答的第一个问题是概念问题。 谁应该拥有该资源,以及谁在使用它。
如果这两个是相同的,那么unique_ptr似乎是合适的,否则,shared_ptr / weak_ptr可能是合适的,但是再一次,在不了解你的整个问题的情况下,似乎很难给出明确的答案。
例如,如果你的类只是在没有拥有它的情况下使用资源,那么资源应该存储在某个地方的shared_ptr中,你的类应该只保存一个weak_ptr,并且只在它想要使用它时才锁定它,并准备好处理资源被删除的情况(如果发生这种情况)。
编辑:看到你的编辑后 看到你的代码,我不明白为什么你需要一个指针,只需使用经典的std :: string,一切都会好的...(除非我遗漏了一些东西,但这提出了一个问题:为什么一个指针?)