возврат ссылки на вектор из метода и использование его открытых членов - PullRequest
1 голос
/ 27 апреля 2010

У меня есть вектор t_vec, в котором хранятся ссылки на экземпляры класса Too. Код показан ниже. В main у меня есть вектор t_vec_2, который имеет тот же адрес памяти, что и B::t_vec.

Но когда я пытаюсь получить доступ к t_vec_2 [0] .val1, выдается ошибка val1 not declared.

Не могли бы вы указать, что не так? Кроме того, если вы знаете лучший способ вернуть вектор из метода, пожалуйста, дайте мне знать! Заранее спасибо.

class Too {      
      public:             
             Too();
             ~Too(){};
          int val1;
};

Too::Too(){
           val1 = 10;
           };


class B {
      public:
             vector<Too*> t_vec;
             Too*  t1;
             vector<Too*>& get_tvec();
             B(){t1 = new Too();};
             ~B(){delete t1;};
};

vector<Too*>& B::get_tvec(){
    t_vec.push_back(t1);
    return t_vec;
}

int main(){
    B b;
    b = B();
    vector<Too*>& t_vec_2 = b.get_tvec();

    // Getting error    
    std::cout << "\n val1 = " << t_vec_2[0].val1;
    return 0;
}

Ответы [ 2 ]

5 голосов
/ 27 апреля 2010

У вас есть 2 ошибки: Первое уже было сказано, вы должны написать

t_vec_2[0]->val1

вместо

t_vec_2[0].val1

Вторая странная строка b = B ();

Я думаю, тебе следует удалить его. Ошибка возникает потому, что правая часть B () будет удалена сразу после ее создания. Таким образом, вы не получите в объекте b значение 10, как хотите. Просто удалите эту строку, и все будет хорошо!

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

Но когда я пытаюсь получить доступ к t_vec_2 [0] .val1, выдает ошибку val1, не объявленную.

Это потому, что ваш вектор содержит указатели, а не Too объекты. Замените оператор точки (.) оператором стрелки (->), например:

std::cout << "\n val1 = " << t_vec_2[0]->val1;

Как общее правило, вам, вероятно, следует вообще избегать публичных членов.

...