LinuxSir.cn,穿越时空的Linuxsir!

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

c++中的命名空间与静态成员函数的问题,问题解决

[复制链接]
发表于 2008-4-15 01:13:23 | 显示全部楼层 |阅读模式

  1. $ vi socket.hpp
  2.   1 #ifndef _MESSAGE_SOCKET_HPP
  3.   2 #define _MESSAGE_SOCKET_HPP
  4.   3
  5.   4 #include <sys/types.h>
  6.   5 #include <sys/socket.h>
  7.   6
  8.   7 namespace message_socket {
  9.   8         class Socket
  10.   9         {
  11. 10         public:
  12. 11                 Socket();
  13. 12                 ~Socket();
  14. 13
  15. 14                 static void setDomain(int domain);
  16. 15                 static void setType(int type);
  17. 16                 static void setProtocol(int protocol);
  18. 17
  19. 18                 void debugPrint();
  20. 19         private:
  21. 20                 int _socket;
  22. 21                 static int _domain;
  23. 22                 static int _type;
  24. 23                 static int _protocol;
  25. 24         };
  26. 25 }
  27. 26 #endif

复制代码

  1. $ vi socket.cpp
  2.   1 #include "socket.hpp"
  3.   2 #include <iostream>
  4.   3
  5.   4 using std::cout;
  6.   5 using std::endl;
  7.   6 using namespace message_socket;
  8.   7
  9.   8 Socket::Socket()
  10.   9 {
  11. 10         _socket = socket(_domain, _type, _protocol);
  12. 11 }
  13. 12
  14. 13 Socket::~Socket()
  15. 14 {
  16. 15
  17. 16 }
  18. 17
  19. 18 void Socket::setDomain(int domain)
  20. 19 {
  21. 20         _domain = domain;
  22. 21 }
  23. 22
  24. 23 void Socket::setType(int type)
  25. 24 {
  26. 25         _type = type;
  27. 26 }
  28. 27
  29. 28 void Socket::setProtocol(int protocol)
  30. 29 {
  31. 30         _protocol = protocol;
  32. 31 }
  33. 32
  34. 33 void Socket::debugPrint()
  35. 34 {
  36. 35         cout << "_socket: " << _socket << endl;
  37. 36         cout << "_domant: " << _domain << endl;
  38. 37         cout << "_type: " << _type << endl;
  39. 38         cout << "_protocol: " << _protocol << endl;
  40. 39 }
  41. 40
复制代码

  1. $ vi test.cpp
  2. #include "socket.hpp"

  3. using namespace message_socket;

  4. int main()
  5. {
  6.         Socket::setDomain(1);
  7.         Socket::setType(2);
  8.         Socket::setProtocol(0);

  9.         Socket *sock = new Socket;

  10.         sock->debugPrint();

  11.         return 0;
  12. }

复制代码


下面是编译时的错误信息


  1. mikkoyue [ ~/cpp/message ]$ make
  2. make  all-am
  3. make[1]: Entering directory `/home/mikkoyue/cpp/message'
  4. g++  -g -O2   -o testSocket test.o socket.o
  5. socket.o: In function `message_socket::Socket::setDomain(int)':
  6. /home/mikkoyue/cpp/message/socket.cpp:20: undefined reference to `message_socket::Socket::_domain'
  7. socket.o: In function `message_socket::Socket::setType(int)':
  8. /home/mikkoyue/cpp/message/socket.cpp:25: undefined reference to `message_socket::Socket::_type'
  9. socket.o: In function `message_socket::Socket::setProtocol(int)':
  10. /home/mikkoyue/cpp/message/socket.cpp:30: undefined reference to `message_socket::Socket::_protocol'
  11. socket.o: In function `Socket':
  12. /home/mikkoyue/cpp/message/socket.cpp:10: undefined reference to `message_socket::Socket::_protocol'
  13. /home/mikkoyue/cpp/message/socket.cpp:10: undefined reference to `message_socket::Socket::_type'
  14. /home/mikkoyue/cpp/message/socket.cpp:10: undefined reference to `message_socket::Socket::_domain'
  15. /home/mikkoyue/cpp/message/socket.cpp:10: undefined reference to `message_socket::Socket::_protocol'
  16. /home/mikkoyue/cpp/message/socket.cpp:10: undefined reference to `message_socket::Socket::_type'
  17. /home/mikkoyue/cpp/message/socket.cpp:10: undefined reference to `message_socket::Socket::_domain'
  18. socket.o: In function `message_socket::Socket::debugPrint()':
  19. /home/mikkoyue/cpp/message/socket.cpp:36: undefined reference to `message_socket::Socket::_domain'
  20. /home/mikkoyue/cpp/message/socket.cpp:37: undefined reference to `message_socket::Socket::_type'
  21. /home/mikkoyue/cpp/message/socket.cpp:38: undefined reference to `message_socket::Socket::_protocol'
  22. collect2: ld 返回 1
  23. make[1]: *** [testSocket] 错误 1
  24. make[1]: Leaving directory `/home/mikkoyue/cpp/message'
  25. make: *** [all] 错误 2
  26. mikkoyue [ ~/cpp/message ]$

复制代码
发表于 2008-4-15 09:20:44 | 显示全部楼层
static 属性 _domain, _type, _protocol 只有声明, 无定义.

解决方法:
在 socket.cpp 中加入以下行, 位置楼主请自行考虑
  1. int Socket::_domain;
  2. int Socket::_type;
  3. int Socket::_protocol;
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-15 10:35:03 | 显示全部楼层
谢谢楼上的兄弟,问题解决
回复 支持 反对

使用道具 举报

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

本版积分规则

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