2012-08-16 102 views
-1

我的一个C++程序(这里是源代码:https://github.com/dermesser/libsocket)有一个非常大的和奇怪的问题。有一个基类(C++/socket.cpp中的套接字),一个(虚拟)派生类(unix_socket,C++/unixbase.cpp中)和一个“叶”类( unix_stream_server)。数据成员“sfd”在“套接字”(socket.cpp)中声明并初始化。但是,在unix_stream_server :: setup(C++/unixserverstream.cpp)中,“sfd”具有完全不同的值。有点调试输出:基类构造函数和数据成员初始化的奇怪行为

socket constr -1 # <--- "socket" constructor 
unix_socket constr - sfd: 1447345536 # <---- unix_socket constructor 
setup final: 1447345536 # <--- unix_stream_server::setup 
unixserverstream.cpp:76: unix_stream_server::setup: Socket already set up! 

最后一行是由异常传递的错误消息。调试程序给出了相同的结果。

奇怪的是,变量的价值差异很大,我不明白为什么。在具有相似继承路径的兄弟类中,这个问题不存在。

编辑1:如果我重新分配“sfd”,问题甚至不会消失。它只是保持在同样奇怪的价值。

有些问题我消除的东西我想:

  • 定义/声明不匹配(我知道,这是很奇怪在这个软件)
  • 把“SFD”公众区域

还有什么可能的问题:如果我通过静态或动态链接程序(它是示例++/unix_server_stream.cpp)(针对Makefile生成的SO)存在问题。

,我渴望:(有没有人有这样的问题,想法或经验,还是我太累了,找到解决方案

编辑2:?这很难张贴代码,我认为这是更好,如果你遵循。我提示github存储库中的文件,因为我不知道应该发布哪一部分。:|对不起......(请不​​要以为我希望你为我工作 - 只是很难选择正确的代码)

unix_stream_server ::设置():

if (sfd != -1) 
     throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Socket already set up!\n"); 
if (path == NULL) 
     throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Path is NULL!\n"); 

    sfd = create_unix_server_socket(path,STREAM,flags); 

    _path.assign(path); 

if (sfd < 0) 
     throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Error at creating UNIX stream server socket!\n"); 
+1

邮政编码,而不是词:-) – 2012-08-16 20:06:04

+0

我会说'sfd'未初始化,基于值。 – 2012-08-16 20:24:03

+0

如果你明确地调用子类构造函数中的父类构造函数(例如'unix_socket :: unix_socket(void):socket :: socket(),_path(“”){}''和'unix_stream_server'类似)帮帮我? – 2012-08-16 20:28:45

回答

0

ÿ我们的标题在class unix_stream_server的定义中有bool listening,但是您的.cpp文件有另一个class unix_stream_server的定义,它省略了bool listening成员。不要这样做。严重的是,不要这样做。从你的实现文件中包含你的头文件!请!

+0

非常感谢:D这就像我说的,太累了找不到这样的错误。是的,我会用双重声明来改变这种情况,这是我有过的最糟糕的想法,而且我已经遇到了几个问题。 :) – dermesser 2012-08-17 07:28:19

+0

最好的问题是SIGSEGV,因为虚拟基类声明不匹配:P – dermesser 2012-08-17 07:34:42

相关问题