LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 862|回复: 6

用vetcor容器装一个object时出现这样的错误

[复制链接]
发表于 2006-3-10 16:11:53 | 显示全部楼层 |阅读模式
源代码如下:

  1. #include <iostream>
  2. #include <vector>
  3. #include <stl_vector.h>

  4. using namespace std;

  5. class Foo
  6. {
  7. public:
  8.       Foo();
  9.       Foo(int px, int py, int pz):x(px), y(py), z(pz) { };
  10.       virtual  ~Foo();

  11.       virtual void set(int x, int y, int z);
  12.       virtual void get() const;
  13. public:
  14.      int x, y, z;
  15. };
  16. Foo::Foo()
  17. {
  18. }
  19. Foo::~Foo()
  20. {
  21. }
  22. void Foo::set(int x, int y, int z)
  23. {
  24. }
  25. void Foo::get() const
  26. {
  27. }

  28. int main(void)
  29. {
  30.     vector<Foo> vf;
  31.     vector<Foo> vf2;
  32.     vector<Foo>::iterator Itefoo;
  33.     vector<Foo>::pointer Poifoo;
  34.     for (int i=0; i<10; i++) {
  35.          Foo *obj = new Foo(i+0, i+1, i+2);
  36.          vf2.push_back(*obj);      
  37.     }
  38. #if 1
  39.     for (Itefoo=vf2.begin(); Itefoo!=vf2.end(); Itefoo++)
  40.          cout << "Data is:" << Itefoo->x <<
  41.                                cout << Itefoo->y <<
  42.                                cout << Itefoo->z << endl;
  43. #endif
复制代码

编译出现:

  1. [root@root Project]# g++ test.cpp -o test
  2. [root@root Project]# ./test
  3. Data is:00x804b38c10x804b38c2
  4. Data is:10x804b38c20x804b38c3
  5. Data is:20x804b38c30x804b38c4
  6. Data is:30x804b38c40x804b38c5
  7. Data is:40x804b38c50x804b38c6
  8. Data is:50x804b38c60x804b38c7
  9. Data is:60x804b38c70x804b38c8
  10. Data is:70x804b38c80x804b38c9
  11. Data is:80x804b38c90x804b38c10
  12. Data is:90x804b38c100x804b38c11
  13. [root@root Project]#
复制代码

如何将一个object放到container中, 如何得到一个object从container中

问题2 :pinter与iterator的区别
发表于 2006-3-10 17:52:43 | 显示全部楼层
晕倒。。。
试试这个:


  1. #include <iostream>
  2. #include <vector>

  3. using namespace std;

  4. class Foo
  5. {
  6. public:
  7.       Foo();
  8.       Foo(int px, int py, int pz):x(px), y(py), z(pz) { };
  9.       virtual  ~Foo();

  10.       virtual void set(int x, int y, int z);
  11.       virtual void get() const;
  12. public:
  13.      int x, y, z;
  14. };
  15. Foo::Foo()
  16. {
  17. }
  18. Foo::~Foo()
  19. {
  20. }
  21. void Foo::set(int x, int y, int z)
  22. {
  23. }
  24. void Foo::get() const
  25. {
  26. }

  27. int main(void)
  28. {
  29.     vector<Foo> vf;
  30.     vector<Foo> vf2;
  31.     vector<Foo>::iterator Itefoo;
  32.     vector<Foo>::pointer Poifoo;
  33.     for (int i=0; i<10; i++) {
  34.          Foo *obj = new Foo(i+0, i+1, i+2);
  35.          vf2.push_back(*obj);
  36.     }
  37. #if 1
  38.     for (Itefoo=vf2.begin(); Itefoo!=vf2.end(); Itefoo++)
  39.          cout << "Data is:" << Itefoo->x << Itefoo->y << Itefoo->z << endl;
  40. #endif
  41. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-12 14:24:37 | 显示全部楼层
1: 这里的Itefoo是指向vector中一个object元素的指针,那为什么不可以用成员作用域,如下:
  1. << Itefoo::x << Itefoo::y << Itefoo::z << endl;
复制代码

2: 如果按照下面这样用,为什么有出错呢:
  1. << *Itefoo.x << *Itefoo.y << *Itefoo.z << endl;
复制代码

  1. [root@root Project]# g++ test.cpp -o test
  2. test.cpp: In function `int main()':
  3. test.cpp:46: error: 'class __gnu_cxx::__normal_iterator<Foo*, std::vector<Foo, std::allocator<Foo> > >' has no member named 'x'
  4. test.cpp:47: error: 'class __gnu_cxx::__normal_iterator<Foo*, std::vector<Foo, std::allocator<Foo> > >' has no member named 'y'
  5. test.cpp:48: error: 'class __gnu_cxx::__normal_iterator<Foo*, std::vector<Foo, std::allocator<Foo> > >' has no member named 'z'
  6. [root@root Project]#
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-12 19:09:02 | 显示全部楼层
1. 只有声明为static的成员才能使用成员作用域。如static int x, y, z;

2. IteFoo->x 相当于 (*IteFoo).x,也就是说.比*优先级高。*IteFoo.x成了IteFoo.x的dereference,而IteFoo类型是vector<Foo>::iterator,自然没有x/y/z这样的成员变量。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-13 09:50:01 | 显示全部楼层
多谢两位大虾。
1:用迭代器访问容器中的Ojbect的data member和function member时好像都不是通过成员作用域::来访问的而是用常用的指针和值来访问即:
                   Iterator  x->data_member || (*x).data_member

                   Iteraotr  x->function_member || (*x).function_member
2:尝试过用作用域来访问function但有错,也试过用改成static来访问也有错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-16 10:51:30 | 显示全部楼层
在二位大虾的指导下,可以通过迭代器访问data_member,但是如何通过迭代器访问function_member呢?这里一直没编译过。
谢谢先。不胜感激
回复 支持 反对

使用道具 举报

发表于 2006-3-18 10:54:54 | 显示全部楼层
Post by sybaselu
在二位大虾的指导下,可以通过迭代器访问data_member,但是如何通过迭代器访问function_member呢?这里一直没编译过。
谢谢先。不胜感激


你是怎么写的?

btw: 你究竟有没有看过一本关于cpp的书籍?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表