В программе на C ++ я объявляю переменную e следующим образом:

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

Затем инициализируется e .

Позже в программе я хочу изменить размер e , используя эту функцию:

e->change(4);

Где класс c_t и функция c_t :: change определены как:

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;
    };
};

Однако такой подход не работает. Когда я использую итератор для чтения e , я понимаю, что значения e равны inf . Почему? Как мне изменить e ?

Изменить: Чтобы считать, фактически масштабируя, значения e , класс c_t использует эту функцию:

void scaling(double factor) {
    for (auto it = m.begin(); it != m.end(); ++it) {
        m *= factor;
    };
};
1
Medical physicist 15 Апр 2016 в 10:47

2 ответа

Лучший ответ
m_buffer = 3.14 * i;

m_buffer имеет тип std::shared_ptr. Ваше задание не имеет смысла. Вы, наверное, хотели написать:

*m_buffer = 3.14 * i;

Также вы хотите объявить m_buffer внутри цикла for, чтобы значения в векторе имели разные значения в зависимости от i.

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);
};

Или более короткая версия:

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

Live демо

1
rozina 15 Апр 2016 в 07:59

Вы пробовали использовать vector :: assign?

m.assign(newSize, m_buffer);
0
Henningsson 15 Апр 2016 в 07:53