2016-04-01 15 views
-2

私はC++をかなり新しくしており、ポインタに関しては問題があります。私は、次のC++ - 'Object'から 'Object *'への引数1の変換はありません

Object object("someText"); 

は、私は、私は私が呼ぶので

void ClassA:: addObj(Object* o){ 
    list.push_back(o); 
} 

addObj(object); 

Iのための方法を持っているベクトルに追加したいやってオブジェクトを作成しましたエラーを取得します。

no known conversion for argument 1 from 'Object' to 'Object*'

Hオブジェクトをポインタに変換してaddObj()に渡すことはできますか?

答えて

2

Objectとポインタは、二つの異なるものです。コンパイラは、型をそのポインタ型に暗黙的に変換しません。あなたはオペレーター(&)の住所であなた自身でそれをしなければなりません。

変更

addObj(object); 

addObj(&object); 

Objectへのポインタを渡します。そのポインタはobjectを指します。

ポインタを追加したリストの前にobjectが範囲外になると、ダングリングポインタがあり、使用することは未定義の動作であることを指摘します。ポインターの所有権を持っている場合は、std::shared_ptrまたはstd::unique_ptrをintにしてください。

0

以下のコードを参照してください:Object

addObj(&object); 
0

&オブジェクトのアドレスを取得できます。したがって、&objectは、あなたにそのオブジェクトへのポインタを与えます。

0

あなたのオブジェクトへのポインタをVectorに追加したいので、スタックに割り当てられたオブジェクトが実際にあなたが探しているものではないと思います。 NathanOliverがすでに指摘したように

auto object = new Object{"someText"}; 

すると、あなたがstd::shared_ptr<>を使用することを好む必要があります。より良いあなたはもう少しエレガントな構文を持つことができますnew

Object* object = new Object("someText"); 
// .... 
addObj(object); 

はC++ 11で始まると、ヒープ上に割り当てますまたはstd::unique_ptr<>。どのオブジェクトが使用された後にオブジェクトを解放するかは、誰が責任を負うかによって決まります。

ベクトルクラスがすべてのオブジェクトを所有していて、ベクトルがそれ以上なくなるとすぐに削除する必要がある場合、ベクトルは​​になり、ユーザーは未処理のポインタにアクセスできるようになります。

void ClassA::addObj(unique_ptr<Object>&& o) { // take a rvalue-reference here 
    list.push_back(std::move(o)); // hand over ownership to the unique pointer in the list 
} 

Object* get(const size_t index) { 
    // please add some sanity checks here 
    return list.at(index).get(); // assuming, list actually ist a std::vector 
} 

ユーザーはどこにでもstd::shared_ptr<>を使用し、それを維持するだろう長いベクトルよりも存続ベクトル、からオブジェクトへのポインタを維持することができるはず場合:

void ClassA::addObj(const shared_ptr<Object>& o) {   
    list.push_back(o); 
} 

shared_ptr<Object> get(const size_t index) { 
    // please add some sanity checks here 
    return list.at(index); // assuming, list actually ist a std::vector 
} 

もいることを、覚えておいてください独自のベクトル/リスト/マップなどを実装することは、教育プロジェクトとしてはうまくいきます。プロダクションコードでは、標準ライブラリに頼ることをお勧めします。あなたはおそらくそれを良くしません。

関連する問題