2017-05-09 11 views
0

私はこの記事のタイトルに示したようMQTTトピックに一定の低音クラスをリンクするマップを作成しようとしていますタイトル。はSTDに値を設定することはできません::マップ<はstd ::文字列、のstd :: shared_ptrの<class>>

私は生の(Cスタイル)のポインタでの作業持っているが、私は学校で学んだようにスマートポインタは、より良い設計オプションになります。

マップをインスタンス化するときに問題は発生しませんが、マップにデータを割り当てる必要があります。

私はそれが完璧に働い持っ方法は、次のとおりです。このコードは、「センサー」で

std::map<std::string,sensors*> factory; 
factory["sensorTwo"]= new sensor1; 

はSENSOR1の基底クラスです。

私はこのようにそれをやろう:

std::map<std::string,std::shared_ptr<sensors>> factory; 
factory["sensorOne"]= std::make_shared<sensors> (sensor1); 

コンパイラは前に一次式を求めます「;」 2行目に。 最初の例の割り当ては明らかにshared_ptrでは機能しませんが、これを行う方法について誰かが知っていますか?

主なルックスを次のように

次のように構造 FooBarを宣言して考えると
#include <string> 
#include <memory> 
#include <map> 

#include "sensors.h" 
#include "sensor1.h" 
#include "sensor2.h" 


int main() 
{ 
    //std::map<std::string,sensors*> factory; 

    std::map<std::string,std::shared_ptr<sensors>> factory; 
    factory["sensorOne"]= std::make_shared<sensor1>(); 
    return 0; 
} 
+5

(http://coliru.stacked-crooked.com/a/5a3e115f04392bc2)[再現することはできません]。 [mcve]を入力してください。 – NathanOliver

+1

あなたの3つの '* .h'ファイルに何が入っているのかわからない場合、' main'を見ることはあまり役に立ちません。 –

+0

MQTTは説明できません。役に立たない(削除する必要があります)、または説明が必要です。 – Yakk

答えて

3

Barインスタンスにstd::shared_ptr<Foo>ポインティングを行うことがstd::make_sharedため

struct Foo {}; 
struct Bar : Foo {}; 

正しい構文は次のとおりです。

std::shared_ptr<Foo> sp = std::make_shared<Bar>(); 
あなたの最初の例から

は、FoosensorsあるとBarsensor1です。だからあなたのコードはすべきではない:

factory["sensorOne"]= std::make_shared<sensors> (sensor1); 

しかし:あなたが<map>に含ま不足している

factory["sensorOne"]= std::make_shared<sensor1>(); 
+0

ありがとう!私はあなたの答えを10分で受け入れられるとマークすることができます。 – Xinq

+0

メモリからオブジェクトを削除する方法も知っていますか? (単一の、可能であればループ内でも動的に) – Xinq

+2

スマートポインタを使用しているので、削除を管理する必要はありません。それを指す最後の 'share_ptr'が破棄されるとメモリが解放されます – wasthishelpful

0

、それがこのエラーメッセージを引き起こす可能性があります。

+1

私はOPがコピー貼りを忘れてしまったと思います... – einpoklum

+2

@einpoklum実際、これはエラーを説明する可能性のようです。 OPの例は[MCVE]ではないので、皆は基本的に推測しています。 – Yakk

+3

@ヤクそれで、最初の行ではなく、2番目の行ではエラーはないでしょうか? – NathanOliver

関連する問題