2014-02-25 2 views
0

Что я здесь делаю неправильно? Мне нужно сделать второй конструктор, который принимает структуру по значению.Передайте структуру конструктору

note.h

class Traymenu; 

class Note : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit Note(Traymenu *trayMenuIn, QWidget *parent = 0); //Working 
    explicit Note(Traymenu *trayMenuIn, struct prop bla, QWidget *parent = 0); //ERROR forward declaration of "struct prop" 

note.h (алтернативной)

class Traymenu; 
struct prop;   //ERROR: forward declaration of "struct prop" 

class Note : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit Note(Traymenu *trayMenuIn, QWidget *parent = 0); 
    explicit Note(Traymenu *trayMenuIn, struct prop bla, QWidget *parent = 0); //ERROR forward declaration of "struct prop" 

note.cpp

#include "note.h"  
Note::Note(Traymenu *trayMenuIn, struct prop bla, QWidget *parent) : //ERROR: bla has incomplete type 

ответ

1

Вы принимаете структуру по стоимости, которая требует его полного определения (он должен быть complete type). Передавать по ссылке, чтобы избежать этого:

Note(Traymenu*, const prop& bla); // reference to const is almost 
            // equivalent to pass by value 

Если копия действительно необходимо, включают в себя определение prop.

В файле реализации вам необходимо включить определение prop, если вы выполняете какую-либо операцию над типом, который требует, чтобы он был полным.

Оставьте ключевое слово struct в объявлениях переменных, это не требуется в C++, и я бы счел его плохим.

+0

Ключевое слово 'struct' можно использовать для переадресации объявления – Paranaix

+0

@Paranaix Да, там это необходимо, но не при принятии параметра. – pmr

+0

Я объявляю свою 'struct prop' как общедоступную переменную-член в другом классе, которая вызывает конструктор' Note'constructor. Гектометр Он не может быть ссылкой, потому что структура сразу же изменяется после вызова конструктора – user2366975

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