1

継承されたクラスが明示的なスーパークラスコンストラクターを呼び出すことで、非常に苛立たしい時間を過ごしているようです。構文が正しくないようです。

これまでに見たすべての例では、ヘッダーとインラインクラス定義({}を使用)をヘッダーファイルを使用した前方宣言から分離していないため、ヘッダーファイルをカバーする方法がわかりません。 .hファイルと.ccファイル間の構文。どんな助けでもいただければ幸いです!

これがコンパイラが私に与えるエラーです(gcc):

serverconnection.h:コンストラクター "ServerConnection :: ServerConnection(std :: string、std :: string)":serverconnection.h:25:エラー:入力serverconnection.ccの最後に `{'が必要です:グローバルスコープ:serverconnection。 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:エラー:いいえ「Connection::Connection()」を呼び出すためのマッチング関数

構文を理解していないため、デフォルトのConnectionコンストラクターであるConnection()を呼び出そうとしていることを理解しています。

コードは次のとおりです。

connection.h:

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

connection.cc:

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

serverconnection.h:

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

serverconnection.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からserverconnection.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 に答える