2011-04-09 77 views
0

我是C++的新手,在C語言中有一些經驗,並且學習它我在做作業的時候測試了一些東西。現在,我有C++ rand不適用於屬性初始值設定程序

#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. 是的,我想獲得實例化時,許多對象來創建它的對象載體,以初始化所有MAX_OBJS元素X屬性與價值ñ的載體。
  3. 我試圖讓一些代碼找到一個給定的元素,在這種情況下,最後一個,在一些向量(在這種情況下,在相同的元素是)。我試了幾件事情,如找到find_if,沒有成功。

我想一些建議/我的問題,這是

  1. A線)打印幫助相同數量(隨機一個)MAX_OBJS次
  2. 我不知道比我更好的方法來比較對象B)
  3. C)從不打印出「找到!」

發現不起作用,即使@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

您的代碼無法編譯。 – 2011-04-09 07:14:42

+1

你確定你在這裏準確地複製了你的代碼嗎?它看起來不像應該編譯。舉個例子,在'Many'中,你同時使用'MAX_OBJS'和'objs',但是我沒有看到任何一個定義。同樣在main中,你定義'i',但從來沒有使用它,但是使用'j'而沒有定義它。您還使用'rand'作爲Object中的數據成員和函數,這在最好的情況下是令人困惑的。 – 2011-04-09 07:16:13

+0

這不是我原來的代碼,至少是這個的三倍。我認爲人們可以理解宏的抽象概念,用「objs」表示「obj_list」(疲勞失敗)。我會解決這個問題。 – paulochf 2011-04-09 17:45:09

回答

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

感謝您澄清指針,我總是迷失方向!關於_find_,我提到我以前嘗試過,但它不起作用,因爲編譯器抱怨一些東西。我把這些錯誤放在主帖中。 – paulochf 2011-04-09 17:56:58