2016-04-15 6 views
1

In einem C++ Programm erkläre ich eine Variable e auf diese Weise:C++: Ändern eines Vektors von share_ptr Elemente

shared_ptr<c_t> e = shared_ptr<c_t> (new c_t); 

Dann e initialisiert wird.

Später im Programm, möchte ich e, mit dieser Funktion, um die Größe:

e->change(4); 

Wo die Klasse c_t und die Funktion c_t :: Änderung sind definiert als:

class c_t { 

    public: 
    vector<shared_ptr<double>> m; 

    void change(int n) { 
     vector<shared_ptr<c_double>> mm; 
     shared_ptr<double> m_buffer = make_shared<c_double>(); 
     for(int i = 0; i < n; i++) { 
      m_buffer = 3.14 * i; 
      mm.push_back(m_buffer); 
     }; 
     m = mm; 
    }; 
}; 

Dieser Ansatz funktioniert jedoch nicht. Wenn ich einen Iterator verwende, um und zu lesen, bekomme ich, dass die Werte von und sind inf. Warum? Wie sollte ich e ändern?

Edit: zu lesen, tatsächlich zu skalieren, um die Werte von e, die Klasse c_t diese Funktion verwendet:

void scaling(double factor) { 
    for (auto it = m.begin(); it != m.end(); ++it) { 
     m *= factor; 
    }; 
}; 
+0

Warum Sie 'double' mit' c_double' mischen? Sind sie vom selben Typ? Warum unterschiedliche Namen dann? – rozina

+0

Entschuldigung, dies ist nur ein Dummy-Beispiel. Die realen Klassen sind komplexer. –

+0

Auch was meinst du mit einem Iterator zum Lesen von e? Ist e in einem Container? Zeigen Sie uns den Code, wo Sie e lesen. ps: selbst wenn dies ein Dummy-Beispiel ist, mach es [complete and vertibarable] (http://stackoverflow.com/help/mcve) – rozina

Antwort

1
m_buffer = 3.14 * i; 

m_buffer ist vom Typ std::shared_ptr. Ihre Zuordnung macht keinen Sinn. Sie wollten wohl schreiben:

*m_buffer = 3.14 * i; 

Auch Sie m_buffer innerhalb der for-Schleife erklären wollen, so dass die Werte in dem Vektor unterschiedliche Werte basierend auf i haben.

for(int i = 0; i < n; i++) 
{ 
    std::shared_ptr<double> m_buffer = std::make_shared<double>(); 
    *m_buffer = 3.14 * i; 
    mm.push_back(m_buffer); 
}; 

Oder eine kürzere Version:

for(int i = 0; i < n; i++) 
{ 
    mm.push_back(std::make_shared<double>(3.14 * i)); 
}; 

Live demo

+0

@Medicalphysicist Sie sagen, dass dies Ihre Frage nicht beantwortet hat? Weil der Code kompiliert und funktioniert. Es gibt kein Problem mehr in Ihrer bearbeiteten Frage. – rozina

+0

Ja, das war der Fehler. Vielen Dank! –

0

Haben Sie versucht, Vektor zu verwenden :: zuweisen?

m.assign(newSize, m_buffer); 
+0

Es funktioniert auch nicht. –