C ++ возвращаемый объект - PullRequest
       11

C ++ возвращаемый объект

2 голосов
/ 17 апреля 2010

У меня есть класс с вектором объектов. Что мне нужно сделать, чтобы вернуть один из этих объектов и изменить его вне класса, сохранив изменения? Можно ли делать с обычными указателями? Есть ли стандартная процедура? (И да, мой опыт работы на Java.)

Ответы [ 4 ]

4 голосов
/ 17 апреля 2010

Ваш вопрос немного расплывчат, но вот пример:

class foo
{
public:
    foo()
    {
        vec.resize(100);
    }

    // normally would be operator[]
    int& get(size_t pIndex)
    { // the return type is a reference. think of it as an alias
        return vec[pIndex]; // now the return value is an alias to this value
    }

private:
    std::vector<int> vec;
};

foo f;
f.get(10) = 5;
// f.get(10) returned an alias to f.vec[10], so this is equivalent to
// f.vec[10] = 5

В FAQ есть хороший раздел с ссылками .

Кроме того, если вы новичок в C ++, не пытайтесь учиться с онлайн-ресурсами. Если у вас нет книги, , вам следует , это действительно единственный хороший способ выучить язык.

1 голос
/ 17 апреля 2010

Если вектор содержит указатели на объекты, любое изменение одного из объектов, возвращаемых из вектора (или, точнее, указанного объекта), также повлияет на экземпляр внутри вектора.

0 голосов
/ 17 апреля 2010

Вам необходимо вернуть либо ссылку , либо указатель на объект.

type &getref();   // "type &" is a reference
type *getptr();   // "type *" is a pointer

После этого вызывающая сторона получит доступ к базовому объекту.

Но тогда вам нужно убедиться, что объект не двигается (что может произойти, если вектор должен расти). Вы можете подумать об использовании вместо него std :: list.

0 голосов
/ 17 апреля 2010

Если у вас есть std :: vector, где A - ваш класс, вы можете вернуть std :: vector :: iterator.

class A {
  public: int a;
};

std::vector<A> v = ...;
std::vector<A>::iterator it = v.begin(); // access to the first element
it = v.begin() + 5; // access to the 5-th element (vector can do random access)
// 'it' can now be used elsewhere
it->a = 0; // changes are reflected in the object inside the vector
*it = A(); // changes the object hold by the vector

Помните, что итераторы могут быть недействительными, если вектор меняется!

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