C ++ Явная проблема конструктора суперкласса при использовании заголовочных файлов - PullRequest
1 голос
/ 25 апреля 2009

Кажется, я очень расстраиваюсь, когда унаследованный класс вызывает явный конструктор суперкласса. Я просто не могу понять синтаксис правильно!

Все примеры, которые я до сих пор видел по этому вопросу, не отделяют определение заголовка и встроенный класс (используя {}) от forward-объявлений с файлом заголовка, поэтому я не уверен, как чтобы охватить синтаксис между файлами .h и .cc. Любая помощь будет оценена!

Вот ошибка, которую компилятор выдает мне (gcc):

serverconnection.h: В конструктор «ServerConnection :: ServerConnection (станд :: строка, std :: string) ": serverconnection.h: 25: ошибка: ожидается `{'в конце ввода serverconnection.cc: в глобальном масштабе: serverconnection.cc:20: ошибка: переопределение «ServerConnection :: ServerConnection (станд :: строка, unsigned int, короткое unsigned int, PacketSender *, int) " serverconnection.h: 25: ошибка: «ServerConnection :: ServerConnection (станд :: строка, unsigned int, короткое unsigned int, PacketSender *, int) "ранее определяется здесь serverconnection.cc: в конструктор «ServerConnection :: ServerConnection (станд :: строка, std :: string) ": serverconnection.cc:20: ошибка: нет подходящей функции для вызова в «Соединение :: Соединение ()»

Я понимаю, что он пытается вызвать конструктор 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
}

Заранее большое спасибо!

Ответы [ 3 ]

5 голосов
/ 25 апреля 2009

Вы не помещаете список инициализаторов в объявление класса, но в определение функции. Удалите его из шапки и в вашем .cc файле:

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

ServerConnection::ServerConnection(string myOwnArg, string superClassArg) : Connection(superClassArg) {
     //do my constructor stuff
}
2 голосов
/ 25 апреля 2009

Необходимо переместить список инициализатора базового класса из serverconnection.h в соединение с сервером.

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

И просто объявите конструктор ServerConneciton без какого-либо украшения в заголовке.

0 голосов
/ 25 апреля 2009

Вам не хватает точки с запятой в конце объявления вашего класса:

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

Забывание, которое может привести к некоторым очень запутанным сообщениям об ошибках, и компилятор не поместит ошибку в файл там, где ошибка действительно есть.

И если вы предоставляете список инициализации элемента в объявлении / определении конструктора, вам необходимо предоставить фигурные скобки для остальной части реализации, даже если вы не помещаете в эти фигурные скобки какой-либо код. Представьте, что список инициализации элементов является частью определения, а не частью объявления.

...