【问题标题】:C++ rand doesn't work with attribute initializerC++ rand 不适用于属性初始值设定项
【发布时间】:2011-08-01 23:40:28
【问题描述】:

我是 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. 我读到 time(0) 可以改变一些结果,但并没有改变什么。
  2. 是的,我想要一个 Many 对象在实例化时创建它的 Object 向量,该向量将其所有 MAX_OBJS 元素 x 属性初始化为值 n
  3. 我试图编写一些代码来查找给定元素,在本例中为最后一个元素,在某个向量中(在本例中,与元素所在的位置相同)。我尝试了一些类似 findfind_if 的方法,但没有成功。

我想要一些关于我的问题的建议/帮助,这些是

  1. A 行)打印相同的数字(随机数)MAX_OBJS 次
  2. 我不知道比 B) 中更好的方法来比较对象
  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 _RandomAccessIterator = __gnu_cxx::__normal_iterator >, _Tp = Object]':

/usr/include/c++/4.5/bits/stl_algo.h:4209:45: 从 '_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator >, _Tp =对象]'

../src/Many.cpp:48:74: 从这里实例化

/usr/include/c++/4.5/bits/stl_algo.h:158:4: 错误:'_first 中的'operator==' 不匹配。_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: 从 '_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator >, _Tp =对象]'

../src/Many.cpp:48:74: 从这里实例化

/usr/include/c++/4.5/bits/stl_algo.h:162:4:错误:'_first 中的 'operator==' 不匹配。_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:错误:'_first 中的 'operator==' 不匹配。_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:错误:'_first 中的 'operator==' 不匹配。_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: 错误:'_first 中的 'operator==' 不匹配。_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: 错误:'_first 中的 'operator==' 不匹配。_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:错误:'_first 中的 'operator==' 不匹配。_gnu_cxx::__normal_iterator<_iterator _container>::operator* with _Iterator = Object*, _Container = std::vector, __gnu_cxx::__normal_iterator<_iterator _container>::reference = Object& == __val'


谢谢!

【问题讨论】:

  • 你确定你在这里准确地复制了你的代码吗?它看起来根本不应该编译。例如,在Many 中,您同时使用MAX_OBJSobjs,但我没有看到两者的定义。同样,在 main 中,您定义了 i 但似乎从未使用它,但使用 j 却从未定义它。您还使用 rand 作为 Object 内部的数据成员和函数,这充其量是令人困惑的。
  • 这不是我的原始代码,至少是这个代码的三倍。我认为人们可以理解宏的抽象,而“objs”是指“obj_list”(疲劳失败)。我会解决的。

标签: c++ pointers random vector constructor


【解决方案1】:
if (&(*j) == &t)

您正在比较上述if 条件中的对象的地址。但是下面这行复制了原始对象:

Object t = many.obj_list.back();

副本意味着t 与列表中的对象不同。因此你的程序永远不会打印Found!

我认为你需要这样写:

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

它存储对象的引用。它不会复制obj_list 中的原始对象。


对了,为什么不用&lt;algorithm&gt;头文件中的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;

【讨论】:

  • 感谢指针的澄清,我总是迷失方向!关于find,我提到我之前尝试过但它不起作用,因为编译器会抱怨一些东西。我将这些错误放在主帖中。
猜你喜欢
  • 1970-01-01
  • 2014-03-02
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2011-04-08
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多