2

我对此进行了很多搜索。但可能是我的措辞不正确。

考虑,

Class A {};

Class B {

public:
    A* getA();
    void setA(A *aVarParam);

private:
    A *aVar;
};

现在由于 aVar 是类 BI 的成员变量,因此希望确保只要类 B 的相应对象存在,它就保持活动状态。

所以我在这里看到的选项是,

  1. 制作 aVarParam 的深层副本并持有指向它的指针。
  2. 使用类似 Boost 共享指针的东西。

两者看起来要么工作量太大,要么语法丑陋。我在这里错过了什么吗?是否所有 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(一个 QT 应用程序)。并且将有许多 Schema Builders 将实际与不同的数据库进行通信以填充 UI 将使用的 DBSchema 对象。

我希望这能澄清我想要实现的目标。我不是 C++ 程序员。在对 Java、Objective-C、PHP 和 JavaScript 编程多年之后,我试图满足编写“真正的 C++”应用程序的渴望。

4

3 回答 3

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
于 2013-09-19T16:45:40.970 回答
3

如果您希望 B 拥有对象 A,那么在诸如

A* getA();

谁应该删除对象?

即使使用 a 的附加语法shared_ptr 会使拥有该对象的类的用户清楚。

std::shared_ptr<A> getA();

如果您想将对象传递给其他人,请std::unique_ptr改用。

添加它并没有太多开销,它使您的代码更易于阅读。

于 2013-09-19T16:27:15.710 回答
3

我认为您需要回答的第一个问题是概念问题。谁应该拥有资源,谁在使用它。

如果这两个相同,则 unique_ptr 似乎是合适的,如果不是,则 shared_ptr/weak_ptr 可能是合适的,但同样,在不了解您的整个问题的情况下,似乎很难给出明确的答案。

例如,如果您的类只是使用资源而不拥有它,则该资源应该与 shared_ptr 一起存储在某个地方,并且您的类应该只持有一个weak_ptr,并且只有在它想要使用它时才锁定它,并做好准备处理资源已被删除的情况(如果应该发生)。

编辑:在看到你的编辑看到你的代码之后,我不明白你为什么需要一个指针,只需使用经典的 std::string 就可以了……(除非我遗漏了什么,但那提出了一个问题:为什么是指针?)

于 2013-09-19T16:28:21.683 回答