2017-05-09 2 views
0

에서 값을 설정할 수 없습니다. 특정베이스 클래스를 MQTT 항목에 연결하기 위해이 게시물의 제목에 표시된대로 맵을 만들려고합니다. 제목.std :: map <std :: string, std :: shared_ptr <class>>

원시 (C 스타일) 포인터로 작업하고 있지만 학교에서 배운 스마트 포인터는 더 나은 디자인 옵션입니다.

지도를 인스턴스화 할 때 문제가 발생하지 않지만 데이터를 할당하려고 할 때 발생합니다.

나는 그것이 완벽하게 작동있어 한 방법은 다음과 같습니다

이 코드 "센서"에서
std::map<std::string,sensors*> factory; 
factory["sensorTwo"]= new sensor1; 

이 센서 1의의 base class입니다;

나는 이런 식으로 작업을 수행 할 때 :

컴파일러 전에 기본 표현을 요구
std::map<std::string,std::shared_ptr<sensors>> factory; 
factory["sensorOne"]= std::make_shared<sensors> (sensor1); 

';' 두 번째 줄에. 첫 번째 예제의 할당은 shared_ptr에서 분명히 작동하지 않지만 아무에게도이를 수행하는 방법에 대한 아이디어가 있습니까?

주요 외모를 다음과 같이

#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

세 개의'* .h' 파일에 무엇이 들어 있는지 모르는 경우'main'을 보는 것이별로 도움이되지 않습니다. –

+0

MQTT는 설명 할 수 없습니다. 쓸데없는 (그래서 삭제되어야한다), 또는 설명이 필요하다. – Yakk

답변

3

다음과 같이 구조 FooBar를 선언 감안할 때 :

struct Foo {}; 
struct Bar : Foo {}; 
std::make_shared에 대한

올바른 구문은 Bar 인스턴스를 가리키는 std::shared_ptr<Foo>을 만드는 것입니다 :

std::shared_ptr<Foo> sp = std::make_shared<Bar>(); 

첫 번째 예에서 Foosensors이고 Barsensor1입니다. 그래서 코드가 안 :

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

그러나 :

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

감사합니다! 10 분 안에 답을 표시 할 수 있습니다. – Xinq

+0

어쩌면 메모리에서 개체를 삭제하는 방법을 알고 있습니까? (하나의 루프와 가능하면 루프 안에서 동적으로) – Xinq

+2

스마트 포인터를 사용하고 있기 때문에 삭제를 관리 할 필요가 없습니다. 마지막 'share_ptr'을 가리키면 메모리가 해제됩니다 – wasthishelpful

0

하는 것은 당신이이 <map>에 포함 누락을,이 오류 메시지가 발생할 수 있습니다.

+1

나는 OP가 복사 - 붙여 넣기를 잊어 버렸을 것입니다. – einpoklum

+2

@einpoklum 사실 이것은 오류를 설명하는 가능성처럼 보입니다. OP의 예는 [MCVE]가 아니므로 모두가 기본적으로 추측합니다. – Yakk

+3

@Yakk 그러면 첫 번째 줄에는 오류가없고 두 번째 줄에는 오류가 없습니까? – NathanOliver

관련 문제