C ++ rand не работает с инициализатором атрибута - PullRequest
0 голосов
/ 09 апреля 2011

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

#define MAX_OBJS 4

using namespace std;

class Object {
    public:
        int x, rand;

        Object(int y) {
            x = y;
            rand = rand() % 5;
        };
};

class Many {
    public:
        vector<Object> obj_list;

    Many(int n): obj_list (MAX_OBJS, n) {}
};

int main() {
    srand(time(NULL));

    Many many(42);

    cout << "Example: looking for " << many.obj_list.back().rand "\n";

    vector<Object>::iterator j;
    Object t = many.obj_list.back();
    for (j = many.obj_list.begin(); j != many.obj_list.end(); j++) {
/*A*/   cout << j->rand << "\n";
/*B*/   if (&(*j) == &t)
/*C*/       cout << "Found!" << "\n";
    }

    return EXIT_SUCCESS;
}

Из этого куска кода я могу сказать

  1. Я читал, что время (0) может изменить какой-то результат, но ничего не изменилось.
  2. да, я хотел бы получить объект Many для создания своего вектора объектов при его создании, причем вектор инициализирует все свои элементы MAX_OBJS x атрибут со значением n .
  3. Я пытался создать какой-то код, чтобы найти данный элемент, в данном случае последний, в каком-то векторе (в данном случае, тот же, где находится элемент). Я попробовал пару вещей, таких как find и find_if , но безуспешно.

Я хотел бы получить совет / помощь по моим проблемам, которые

  1. Строка A) печатает одно и то же число (случайное) MAX_OBJS times
  2. Я не знаю лучшего способа сравнения объектов, чем в Б)
  3. Строка C) никогда не печатает "Найдено!"

find не работает, даже с предложением @Nawaz. Компилятор говорит:

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: в функции ' RandomAccessIterator std :: _find (_RandomAccessIterator, _RandomAccessIterator, const _Tp &, std :: random_access_iterator_tag) [with_uc____ _ _) :: __ normal_iterator>, _Tp = Object] ':

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 4209: 45: создается из '_IIter std :: find (_IIter, _IIter, const _Tp &) [с _IIter = __gnu_cxx :: __ normal_iterator>, _Tp = Object]

.. / src / Many.cpp: 48: 74: создается здесь

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 158: 4: ошибка: нет совпадения для 'operator ==' в '_ first. _gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator * с _Iterator = Object *, _Container = std :: vector, __gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: reference = Object & == __val '

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 4209: 45: создается из '_IIter std :: find (_IIter, _IIter, const _Tp &) [с _IIter = __gnu_cxx :: __ normal_iterator>, _Tp = Object]

.. / src / Many.cpp: 48: 74: создается здесь

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 162: 4: ошибка: нет совпадения для 'operator ==' в '_ first. _gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator * с _Iterator = Object *, _Container = std :: vector, __gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: reference = Object & == __val '

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 166: 4: ошибка: нет совпадения для 'operator ==' в '_ first. _gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator * с _Iterator = Object *, _Container = std :: vector, __gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: reference = Object & == __val '

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 170: 4: ошибка: нет совпадения для 'operator ==' в '_ first. _gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator * с _Iterator = Object *, _Container = std :: vector, __gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: reference = Object & == __val '

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 178: 4: ошибка: нет совпадения для 'operator ==' в '_ first. _gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator * с _Iterator = Object *, _Container = std :: vector, __gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: reference = Object & == __val '

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 182: 4: ошибка: нет совпадения для 'operator ==' в '_ first. _gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator * с _Iterator = Object *, _Container = std :: vector, __gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: reference = Object & == __val '

/ usr / include / c ++ / 4.5 / bits / stl_algo.h: 186: 4: ошибка: nо 'оператор ==' в '_ сначала. _gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator * с _Iterator = Object *, _Container = std :: vector, __gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: reference = Object & == __val '


Спасибо!

1 Ответ

2 голосов
/ 09 апреля 2011
if (&(*j) == &t)

Вы сравниваете адреса объектов в условии if выше. Но следующая строка делает копию оригинального объекта:

Object t = many.obj_list.back();

Копия означает, что t - это не тот же объект из списка. Следовательно, ваша программа никогда не напечатает Found!.

Я думаю, вам нужно написать это как:

Object & t = many.obj_list.back();
    // ^ note this!

Хранит ссылку на объект. Это не делает копию оригинального объекта в obj_list.


Кстати, почему бы вам не использовать std::find из <algorithm> заголовочного файла?

#include <algorithm>

std::vector<Object>::iterator it = std::find(many.obj_list.begin(), many.obj_list.end(), t)
if ( it != many.obj_list.end())
     std::cout << "Found!"<< std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...