問題タブ [auto-ptr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - auto_ptr で使用する「安全な」 push() 関数を提供する
push()
次のように使用する「安全な」関数を宣言したいauto_ptr
:
また、null ポインターに対しても機能するようにします。たとえば、次のようになります。
したがって、専門化:
動作しますが、醜く、次のような誤ったコードを許可します。
コンパイルする。
有効な値 (null ポインターの場合)としてpush()
のみ受け入れるような特殊化を作成するにはどうすればよいですか?0
int
要件
StackType
は、使用する必要があり、ソース コードを変更できないスタックのようなコンテナー クラスです(のようにstd::stack
)。push()
メンバー関数があると仮定できます。nullptr
C++0x コンパイラを要求できないため、使用できません。
c++ - このauto_ptrプログラムはどのように機能し、何をしますか?
私はこのプログラムを実行しましたが、このauto_ptrが何をするのか、そしてどの基本で値を表示するのかわかりませんでしたか?
c++ - typedef 関数ポインターを使用した不完全な型
データ シンクへのインターフェイスを定義する抽象基本クラスがあります。データ シンクの具体的な実装は、ファクトリを介して取得されます。コードを整理するために、DataSink 抽象基本クラス内から新しい DataSink オブジェクトを返すファクトリ メソッドの typedef を作成しました。
boost::function<get_new_data_sink_function_type> getNewDataSinkFunction_;
その後、どこかで a: を宣言しようとすると、次のようになります。
error: field 'getNewDataSinkFunction_' has incomplete type
代わりに宣言すると:
boost::function<std::auto_ptr<DataSink>(std::string)> getNewDataSinkFunction_;
...すべて問題ありません。
DataSink は抽象的であるため不完全な型であることに気付きましたが、std::auto_ptr による参照セマンティクスを使用しているため、それで問題ないはずですよね? いずれにせよ、typedef が失敗し、typedef の定義のカット アンド ペーストが成功する理由は説明できません。これは boost::function の癖ですか?
コンパイラは gcc 4.3.3 です。どんな洞察も大歓迎です。
c++ - 配列で auto_ptr<> を使用する
クラスポインタ型の配列を使用するものを使用auto_ptr<>
しているので、それに値を割り当てるにはどうすればよいですか。
例えば
auto_ptr<class*> arr[10];
arr
配列に値を代入するにはどうすればよいですか?
c++ - ブーストとc++0xなしで安全に型消去を行う
テンプレート化されたクラスがあるとしましょう
ここで、Aのすべての可能なインスタンスを同じコンテナーに格納する場合は、ベクトルと言います。
次に、古典的な(そして私が知っている唯一の方法)は、純粋な仮想print()メンバー関数を使用して別のクラスA_baseを作成し、Aのインスタンスに初期化されたA_baseへのポインターを格納することです。安全ではないため、この問題を解決する合理的な方法は、boost::shared_ptrまたはstd::tr1 :: shared_ptrを使用することです。これは、std::auto_ptrをコピーすると所有権の問題や未定義の動作が発生する可能性があるためです。
BoostやC++0xの依存関係を含めずに型消去を行う方法はありますか?:)
ありがとう !
c++ - C++ out 変数として auto_ptr 参照を使用していますか?
異種オブジェクトをヒープに割り当てて呼び出し元に返すファクトリ メソッドを書きたいとします。私はこのようなAPIを設計することを考えています:
これにより、呼び出し元はこれを行うことができます。
私の質問は、「これは慣用的なものですか?そうでない場合、これを行う正しい方法は何ですか?」です。
struct
私が考えることができる代替アプローチには、 のを返すことauto_ptr
、またはファクトリ API を記述して生のポインター参照を取得することが含まれます。どちらもより多くのコードを記述する必要があり、後者には例外の安全性に関して他の落とし穴があります。
c++ - どの種類の (自動) ポインターを使用しますか?
T* を使用することは決して最良のアイデアではないという回答がいくつかある質問に出くわしました。
私はすでに RIIC を多用していますが、私のコードには、T* を使用する特定のポイントが 1 つあります。いくつかの自動ポインターについて読んでいますが、それを使用することで明確な利点があると言えるものを見つけることができませんでした。
私のシナリオ:
MyMapper
これは、HashMap<...>*
無関係な問題に関する質問の投票数の多い回答によると、決して良い考えではありません (ただし、マッパーはインスタンスの前に範囲外になるため、MyClass
あまり問題ではないと考えています.new
マッパーには no があり、 noはdelete
必要ありません)。
では、この特定のユースケースで最良の代替手段は何ですか?
c++ - auto_ptr を関数に渡すと、効果的にシンクになります。なんで?
共有ポインタに関するいくつかのメモを読んでいます。彼らは、auto_ptr を使用した STL による最初の試みには、次のような大きな欠点があったと言います。
- STL コンテナでは使用できません
- auto_ptr をコピーすると所有権が譲渡されます
- auto_ptr を関数に渡すと、効果的にシンクになります
最初の 2 つは理解できますが、最後の 1 つは何を意味するのかわかりません。
誰かがこれを説明してくれませんか。
ありがとう。
c++ - 自動ポインタがnullかどうかをテストする方法は?
自動ポインタ初心者です。私はこれを持っています:
myPointer
正常にインスタンス化できるかどうかをテストするにはどうすればよいですか? 私が試したところif (myPointer==NULL)
、コンパイラーはエラーを出しました:
これらのオペランドに一致する演算子「==」はありません。
c++ - std :: auto_ptr使用法
auto_ptrクラスについてのまともな教科書でかなりの量を読みました。私はそれが何であるか、そしてコンストラクターのような場所で例外を取得する問題をどのように回避するかを理解していますが、誰かが実際にそれをいつ使用するかを理解するのに苦労しています。
auto_ptrは単一の型のみを保持できます(配列new []の初期化はサポートされていません)。関数に渡すか、複製しようとすると、所有権が変更されます(参照カウントスマートポインターではありません)。
このクラスの現実的な使用シナリオにはどのような制限がありますか?ほとんどの場合、スタック変数上でポインターを使用する理由さえないので、その使用の教科書の例のほとんどが到達しているようです...
とにかく、私は私の暴言を止めます-しかし、あなたが短い例/説明またはこれのための良い使用シナリオへのリンクを提供することができれば、私は感謝するでしょう。状況に遭遇した場合に備えて、実際にどこで使用すべきかを知りたいだけです。学んだことを練習するのが好きなので、覚えています。