基类构造函数和数据成员初始化的奇怪行为

时间:2012-08-16 20:00:11

标签: c++ inheritance multiple-inheritance

我的一个C ++程序遇到了一个非常大而奇怪的问题(这里是源代码:https://github.com/dermesser/libsocket)。

首先,围绕它的一些细节: 有一个基类(socket,在C ++ / socket.cpp中),一个(虚拟)派生类(unix_socket,在C ++ / unixbase.cpp中)和一个“leaf”类(unix_stream_server)。数据成员“sfd”在“socket”(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 个答案:

答案 0 :(得分:0)

您的标头在bool listening的定义中有class unix_stream_server,但您的.cpp文件的另一个class unix_stream_server定义省略了bool listening成员。不要那样做。说真的,不要那样做。在实现文件中包含您的标题!请!