2009-04-25 1 views
1

У меня, похоже, очень сложное время с унаследованным классом, вызывающим явный конструктор суперкласса. Я просто не могу получить синтаксис правильно!Проблема конструктора с явным явлением суперкласса C++ при использовании файлов заголовка

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

Здесь ошибка компилятор дает мне (НКУ):

serverconnection.h: In constructor "ServerConnection::ServerConnection(std::string, std::string)": serverconnection.h:25: error: expected `{' at end of input serverconnection.cc: At global scope: serverconnection.cc:20: error: redefinition of "ServerConnection::ServerConnection(std::string, unsigned int, short unsigned int, PacketSender*, int)" serverconnection.h:25: error: "ServerConnection::ServerConnection(std::string, unsigned int, short unsigned int, PacketSender*, int)" previously defined here serverconnection.cc: In constructor "ServerConnection::ServerConnection(std::string, std::string)": serverconnection.cc:20: error: no matching function for call to "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 
} 

Большое спасибо!

ответ

5

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

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

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

Спасибо! Я думаю, вы победили Джеффа на 13 секунд, поэтому я помету ваш ответ как принято (извините Jeff!) – 2009-04-25 18:32:58

+0

Спасибо! По какой-то причине подавляющее большинство обучающих программ на C++ не показывают, как обстоят дела при использовании разделенных файлов h и cc .... – jotadepicas

2

Вам нужно переместить список базового класса инициализатора от serverconnection.h к серверу connection.cc:

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

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

+0

Теперь работает отлично! Большое спасибо за ваш быстрый ответ – 2009-04-25 18:30:34

0

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

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

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

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

+0

К сожалению, на самом деле это проблема с вырезанием и вставкой, так как фактический код намного более массивный. Но хороший глаз! – 2009-04-25 18:30:04

Смежные вопросы