2011-01-01 9 views
4

は、私は、関数の作成に記載された質問を参照してください次のコード、C++ - Fred *からauto_ptrへの暗黙のキャストはありますか<Fred>?

#include <new> 
#include <memory> 
using namespace std; 

class Fred; // Forward declaration 
typedef auto_ptr<Fred> FredPtr; 

class Fred { 
public: 
    static FredPtr create(int i) 
    { 
    return new Fred(i); // Is there an implicit casting here? If not, how can we return 
         // a Fred* with return value as FredPtr? 
    } 
private: 
    Fred(int i=10)  : i_(i) { } 
    Fred(const Fred& x) : i_(x.i_) { } 
    int i_; 
}; 

を見ました。

はコメント

に基づいて更新

//はい、コードはVC8.0 エラーC2664渡すことはできませんありがとう「のstd :: auto_ptrを< _Ty>を:: auto_ptrは(のstd :: auto_ptrは< _Ty> &)スロー():フレッド*」からパラメータ1を変換することはできません '' を 'のstd :: auto_ptrを< _Ty> &' のコードはC++よくある質問12.15からコピーされた

ただし、以下の変更を行った後、

replace 
    return new Fred(i); 
with 
    return auto_ptr<Fred>(new Fred(i)); 

このコードは、VC8.0コンパイラを渡すことができます。しかし、これが正しい修正かどうかはわかりません。

+1

このコードはコンパイルされましたか?それともあなたはそれを見ましたか? –

+0

元の投稿はありません。 – q0987

+0

これは正しい修正です。はい。 –

答えて

6

std::auto_ptrは、生ポインタを引数として取りますが、そのコンストラクタはexplicitであり、変換コンストラクタとして使用することはできません。

このコードはコンパイルされません。

+3

'auto_ptr'への暗黙的な変換は' auto_ptr'の所有権セマンティクスを考慮するとかなり狂っています – CodesInChaos

+0

Yah、私の以前の回答を投稿した直後に確かにチェックされています。ありがとう – Kos

+0

@ToAll、本の元のコードはVS8.0のコンパイラを渡されません - ありがとう – q0987

3

いいえ、暗黙の変換はありません。しかし、これは実際には良いことだとわかりました。あなたは、その機能が返されると、一時的なauto_ptrはオブジェクトは、あなたがメインに割り当てられたメモリをクリーンアップされたとき(、MyFunctionのにフレッドに生のポインタを渡すことができれば、ここで

void MyFunction(const std::auto_ptr<Fred>& myFred) { 
    /* ... do something to Fred. */ 
} 

int main() { 
    Fred* f = new Fred; 
    MyFunction(f); // Not legal, but assume it is. 
    f->doSomething(); 
} 

:たとえば、このコードを検討)が再利用され、f-> doSomething()の呼び出しによってsegfaultが発生する可能性があります。 auto_ptrコンストラクタを明示的にすることは、これに対する安全対策です。誰かが既にそのアクセス権を持っていると思っているときに、リソースの排他的な所有権を誤って取得することは望ましくありません。

0

固定コードのコード(return std::auto_ptr<Fred>(new Fred()))は、有効で有効なC++です。しかし、私はcreate()関数がstd::auto_ptr<T>を作成することで何を購入するのかは、C++プログラマーのスキルセット内にあるはずです。同様に、私はtypedef ing std::auto_ptr<Fred> to FredPtrあなたは、FredPtrが実際に何を調べる必要性を購入するかを明確にしていません。

関連する問題