1

我似乎对一个调用显式超类构造函数的继承类感到非常沮丧。我似乎无法正确使用语法!

到目前为止,我在这件事上看到的所有示例都没有将标头和内联类定义(使用 {})与带有头文件的前向声明分开,所以我不确定如何涵盖.h 和 .cc 文件之间的语法。任何帮助,将不胜感激!

这是编译器给我的错误(gcc):

serverconnection.h:在构造函数“ServerConnection::ServerConnection(std::string, std::string)”中:serverconnection.h:25:错误:输入 serverconnection.cc 结尾处预期为“{”:在全局范围内:s​​erverconnection。 cc:20: 错误: 重新定义“ServerConnection::ServerConnection(std::string, unsigned int, short unsigned int, PacketSender*, int)” serverconnection.h:25: 错误:“ServerConnection::ServerConnection(std::string , unsigned int, short unsigned int, PacketSender*, int)" 之前在这里定义 serverconnection.cc: 在构造函数 "ServerConnection::ServerConnection(std::string, std::string)": serverconnection.cc:20: error: no调用“Connection::Connection()”的匹配函数

我知道它正在尝试调用默认的 Connection 构造函数 Connection(),因为它只是不理解我的语法。

这是代码:

连接.h:

class Connection {
    public:
       Connection(string myOwnArg);
};

连接.cc:

#include "connection.h"
Connection::Connection(string myOwnArg) {
     //do my constructor stuff
}

服务器连接.h:

#include "connection.h"
class ServerConnection : public Connection {
    public:
       ServerConnection(string myOwnArg, string superClassArg) : Connection(superClassArg);
};

服务器连接.cc:

#include "serverconnection.h"
#include "connection.h"
ServerConnection::ServerConnection(string myOwnArg, string superClassArg) {
     //do my constructor stuff
}

提前非常感谢!

4

3 回答 3

5

您不要将初始化列表放在类声明中,而是放在函数定义中。从标题中删除它,并在您的 .cc 文件中:

#include "serverconnection.h"
#include "connection.h"

ServerConnection::ServerConnection(string myOwnArg, string superClassArg) : Connection(superClassArg) {
     //do my constructor stuff
}
于 2009-04-25T18:25:03.283 回答
2

您需要将基类初始化程序列表从 serverconnection.h 移动到服务器 connection.cc:

ServerConnection::ServerConnection(string myOwnArg, string superClassArg) 
    : Connection(superClassArg) {
     //do my constructor stuff
}

只需在标头中声明 ServerConneciton 构造函数,无需任何修饰。

于 2009-04-25T18:25:16.077 回答
0

您在类声明末尾缺少分号:

class Connection {
    public:
       Connection(string myOwnArg);
}; // semicolon here

忘记这一点可能会导致一些非常混乱的错误消息,并且编译器不会将错误放在文件中,错误确实存在。

如果您在构造函数声明/定义中提供成员初始化列表,则需要为实现的其余部分提供大括号,即使您没有在这些大括号中放置任何代码。将成员初始化列表视为定义的一部分,而不是声明的一部分。

于 2009-04-25T18:26:37.053 回答