[C++] Source or target has incomplete type

0

Piszę programik testowy, w którym chciałem ogarnąć przekazywanie struktur między plikami i napotkałem się na bardzo dziwny problem.

main.cpp - http://wklej.org/id/425185/
main.h - http://wklej.org/id/425186/

Tam są też elementy z Qt, ale na to nie trzeba zwracać uwagi akurat.

Problem polega na tym, że plik moc, który muszę generować, wyrzuca mi takie błędy:

1>release\moc_main.cpp(72) : error C2664: 'MyWidget::wczytywanie' : cannot convert parameter 1 from 'MyWidget::Zawodnik' to 'MyWidget::Zawodnik'
1> Source or target has incomplete type
1>moc_proba.cpp
1>release\moc_proba.cpp(72) : error C2664: 'Proba::trzebaWyslac' : cannot convert parameter 1 from 'Proba::Zawodnik' to 'Proba::Zawodnik'
1> Source or target has incomplete type

W mocach sprawdzałem i jest to linijka.

<code = cpp>void MyWidget::wczytywanie(Zawodnik gracz)


Ten drugi błąd jest wywoływany w identycznej sytuacji jak tutaj. Wiecie o co moze chodzić?
0
  1. parametr przekazywany przez wartość! Powinno być przez referencję!
    void MyWidget::wczytywanie(const Zawodnik& gracz)

  2. coś pomieszałeś z tym co to: ma robić, jak się nazywa, i to że jest to slot! Jak dla mnie WTF!

0
  1. heh, faktycznie - głupi błąd.

A tego drugiego punktu nie za bardzo rozumiem ;S

0

Heh, ciekawe jest to, że teraz mimo poprawnego kodu i tak funkcja mi się nie wykonuje :S

to jest plik proba.cpp, na którym robię testy:

<code = cpp>struct Proba::Zawodnik
{
int przyjecie;
int odebranie;
int kupa;
};

Proba::Proba(QWidget *parent)
: QWidget(parent)
{
przycisk = new QPushButton("Guziczek");
Zawodnik gracz;
gracz.przyjecie = 5;
gracz.odebranie = 2;
gracz.kupa = 0;
connect(przycisk, SIGNAL(clicked()), this, SLOT(wysylanie(&gracz)));

layout = new QVBoxLayout;
layout->addWidget(przycisk);
setLayout(layout);

}

void Proba::wysylanie(const Zawodnik *plejer)
{
QMessageBox::information(this, tr("cos"), tr("asdasd"));
}


proba.h:

<code = cpp>class Proba : public QWidget
{
	Q_OBJECT
public:
	Proba(QWidget *parent = 0);
	struct Zawodnik;
private:
	QPushButton *przycisk;
	QVBoxLayout *layout;
signals:
	void trzebaWyslac();
public slots:
		void wysylanie(const Zawodnik *);
};

I po wciśnięciu buttonu, funkcja wysylanie się nie wykonuje. Gdy usunę to przekazywanie funkcji jako argument, messagebox się pojawia...

0

Już problem rozwiązałem:

proba.h

<code = cpp>class Proba : public QWidget
{
Q_OBJECT
public:
Proba(QWidget *parent = 0);
struct Zawodnik;
private:
QPushButton *przycisk;
QVBoxLayout *layout;
signals:
void trzebaWyslac(Zawodnik&);
public slots:
void wysylanie(Zawodnik&);
void przekaz();
};


**proba.cpp**

<code = cpp>struct Proba::Zawodnik
{
	int przyjecie;
	int odebranie;
	int kupa;
};

Proba::Proba(QWidget *parent)
: QWidget(parent)
{
	przycisk = new QPushButton("Guziczek", this);
	Zawodnik gracz;
	gracz.przyjecie = 5;
	gracz.odebranie = 2;
	gracz.kupa = 0;
	connect(przycisk, SIGNAL(clicked()), this, SLOT(przekaz()));
	connect(this, SIGNAL(trzebaWyslac(Zawodnik&)), this, SLOT(wysylanie(Zawodnik&)));

	layout = new QVBoxLayout;
	layout->addWidget(przycisk);
	setLayout(layout);
};

void Proba::wysylanie(Zawodnik &plejer)
{
	QMessageBox::information(this, tr("cos"), tr("\"%1\"").arg(plejer.przyjecie));
}

void Proba::przekaz()
{
	Zawodnik graczyk;
	graczyk.przyjecie = 5;
	emit(trzebaWyslac(graczyk));
}

Tak na przyszłośc :P

0

To wytłumacz "tak na przyszłość" jeszcze, że slot powinien przyjmować takie same argumenty jakie przyjmuje sygnał, zaoszczędziłbyś w ten sposób problemów i szukania innym. Gdyby ktoś wcześniej to zrobił sam doszedłbyś do tego szybciej.

0

Teraz już wiem. Wcześniej mi to umknęło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1