2

私はこれについてたくさん検索しました。しかし、私は言い回しを正しく理解していないかもしれません。

検討、

Class A {};

Class B {

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

private:
    A *aVar;
};

ここで、aVar はクラス BI のメンバー変数であるため、クラス B の対応するオブジェクトが存在する限り、aVar が存続することを保証したいと考えています。

ここに表示されるオプションは

  1. aVarParam のディープ コピーを作成し、それへのポインターを保持します。
  2. Boost共有ポインタのようなものを使用してください。

どちらも手間がかかりすぎるか、構文が醜いようです。ここで何か不足していますか?すべての C++ プログラムは、これら 2 つのオプションのいずれかを使用しますか?

詳細説明:

多くの人が、私がどのように使用しているかの例を見たいと思っていました。実際、私は汎用目的の戦略のような答えが欲しかった. したがって、元の例。これが私が使用しようとしている例です:

#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 アプリケーション) を指示するシン モデルとして使用されています。また、さまざまなデータベースと実際に通信して、UI が使用する DBSchema オブジェクトを埋める多くのスキーマ ビルダーが存在します。

私が達成しようとしていることについて、これが明確になることを願っています。私は C++ プログラマーではありません。Java、Objective-C、PHP、JavaScript を何年もプログラミングした後、「本物の C++」アプリケーションを書きたいという欲求を満たそうとしています。

4

3 に答える 3

4

質問のために、オブジェクト自体ではなく、ポインターを格納する正当な理由があると仮定します。ただし、実際のコードが例に似ている場合、文字列へのポインターを格納する正当な理由はありません。

3 番目のオプションは、オブジェクトの所有権を取得することです。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 に答える