2011-04-09 2 views
0

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

을 가지고, 내가 시간 (0)이 어떤 결과를 바꿀 수 있음을 읽을 수는 있지만 아무 것도 변경하지 않았다

  1. 말할 수 있습니다.
  2. 그래, 나는 그것의 MAX_OBJS 요소 값 NX 속성을 모두 초기화 벡터를 인스턴스화 할 때 많은 개체가 해당 개체 벡터를 만들 수 싶습니다.
  3. 주어진 코드를 만들려고했는데,이 코드에서는 마지막 요소를 찾을 수 있습니다 (이 경우에는 요소가있는 코드와 같음). 나는 과 같은 몇 가지 시도를find_if으로 성공하지 못했습니다.

내가

  1. 라인 A) 인쇄되어 내 문제에 도움/조언을 부탁 같은 번호 (임의의 하나) MAX_OBJS 시간
  2. 난 몰라 내가 B에서했던 것보다 객체를 비교하는 더 좋은 방법.
  3. 라인 C) "Found!"

찾을도 @Nawaz의 제안에, 작동하지 않습니다. 컴파일러는 말한다 :

/usr/include/c++/4.5/bits/stl_algo.h: In function ‘RandomAccessIterator std::_find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator >, _Tp = Object]’:

/usr/include/c++/4.5/bits/stl_algo.h:4209:45: instantiated from ‘_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator >, _Tp = Object]’

../src/Many.cpp:48:74: instantiated from here

/usr/include/c++/4.5/bits/stl_algo.h:158:4: error: no match for ‘operator==’ in ‘_first._gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _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: instantiated from ‘_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator >, _Tp = Object]’

../src/Many.cpp:48:74: instantiated from here

/usr/include/c++/4.5/bits/stl_algo.h:162:4: error: no match for ‘operator==’ in ‘_first._gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _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: error: no match for ‘operator==’ in ‘_first._gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _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: error: no match for ‘operator==’ in ‘_first._gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _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: error: no match for ‘operator==’ in ‘_first._gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _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: error: no match for ‘operator==’ in ‘_first._gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _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: error: no match for ‘operator==’ in ‘_first._gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _Iterator = Object*, _Container = std::vector, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Object& == __val’


감사합니다!

+1

코드가 컴파일되지 않습니다. –

+1

여기에 코드를 정확하게 복사 했습니까? 그것은 마치 컴파일해야하는 것처럼 보이지 않습니다. 예를 들어,'Many'에서는'MAX_OBJS'와'objs'를 모두 사용합니다. 그러나 어느 것에 대해서나 정의는 보이지 않습니다. 마찬가지로 main에서'i'를 정의하지만 결코 사용하지 않는 것처럼 보이지만 정의하지 않고'j'를 사용하십시오. 또한'rand'를 데이터 멤버와 Object 내부의 함수로 사용하는데, 이것은 혼란 스럽습니다. –

+0

적어도이 코드의 3 배가되는 원본 코드가 아닙니다. 나는 매크로에서 추상화를 이해할 수 있다고 생각했고, "objs"는 "obj_list"(피곤함 실패)를 의미했습니다. 나는 고칠 것이다. – paulochf

답변

2
if (&(*j) == &t) 

당신은 위의 if 상태에서 객체의 주소를 비교하고 있습니다. 그러나 다음 줄은 원본 객체의 복사본을 만듭니다 :

Object t = many.obj_list.back(); 

사본은 t 목록에서 같은 객체가 아닌 것을 의미한다. 따라서 프로그램은 절대로 Found!을 인쇄하지 않습니다.

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

그것은 개체의 참조를 저장합니다

난 당신이 같이 쓸 필요가 있다고 생각합니다. obj_list에 원래 개체의 복사본을 만들지 않습니다. 그런데


, 당신은 왜 <algorithm> 헤더 파일에서 std::find는 사용하지 마십시오?

#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; 
+0

포인터를 명확히 해 주셔서 감사합니다. _find_에 관해서는, 나는 전에 시도한 것을 언급했지만, 컴파일러가 불평하기 때문에 작동하지 않습니다. 나는 그 실수를 메인 포스트에 넣을 것이다. – paulochf

관련 문제