Доступ и изменение векторов через ссылки на классы - PullRequest
1 голос
/ 18 февраля 2012

Это самое простое, что я мог бы решить мою проблему, извините за длину:

#include <vector>
#include <iostream>

class Bar
{
private:
    std::vector<int> intVector_;
public:
    Bar() {};
    void addInt(int newInt) 
    { 
        intVector_.push_back(newInt); 
        std::cout << intVector_.size() << " "; 
    };
    int getIntVectorSize() { return intVector_.size(); };
};

class Foo
{
private:
    Bar bar_;
public:
    Foo() { bar_ = Bar(); };
    Bar getBar() { return bar_; };
};

int main(char argc, char* argv[])
{
    Foo foo = Foo();
    foo.getBar().addInt(1);
    std::cout << foo.getBar().getIntVectorSize() << " ";
    foo.getBar().addInt(2);
    std::cout << foo.getBar().getIntVectorSize() << " ";
    foo.getBar().addInt(3);
    std::cout << foo.getBar().getIntVectorSize() << " ";
}

Моя проблема в том, что добавление int к вектору, кажется, длится только в течение времени addInt(),Мой вывод для размера вектора выглядит следующим образом:

1 0 1 0 1 0

Я довольно новичок в C ++ и во всем этом бизнесе со ссылками и указателями, поэтому я озадачен тем, как я могу это исправить, или еслиэто даже возможно.Спасибо за любую помощь!

1 Ответ

0 голосов
/ 18 февраля 2012

Это потому, что getBar() возвращает Bar на значение , что делает копию bar_ для каждого вызова функции, и вы изменяете вектор временного.

Вы можете избежать этого, возвращая ссылку:

class Foo
{
private:
    Bar bar_;
public:
    Foo() { bar_ = Bar(); }; // you prob. want to use an initialiser list btw.
    Bar& getBar() { return bar_; };
//     ^ notice the ampersand
};

Таким образом, любые изменения, сделанные для возвращаемого значения getBar, выполняются на bar_, а не на временной копии, которая уничтожаетсяконец утверждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...