C++ Lost in classes

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

C++ Lost in classes

Inlägg av Oltronix »

Håller på och slåss med ett prog som jag försöker modifera till det jag vill ha. Programmet har bla funktionen att omvandla olika typsnitt till sina rastervarianter. Bra om man skall skriva ut tecken på en LED-matris. Just nu är jag ganska lost och får spännande fel vid "make" som:

Kod: Markera allt

"error: invalid use of incomplete type ‘class Ui::SSD1306',
  ui(new Ui::SSD1306),"
när jag försöker lägga till en egen Widget.

Utdrag ur koden:

Kod: Markera allt

namespace Ui {
class SSD1306;
}

class SSD1306 : public QWidget
{
    Q_OBJECT
    friend class SSD1306_Worker;

public:
    explicit SSD1306(QWidget *parent = 0);
    ~SSD1306();
.
.
Ui::SSD1306 *ui;
.
.
ssd1306.h

Kod: Markera allt

#include "ssd1306.h"
#include "ssd1306_worker.h"
#include "ui_ssd1306.h"

SSD1306::SSD1306(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SSD1306),
    _work(NULL)
{
    ui->setupUi(this);
.
.
ssd1306.cpp

Kan jag ha olika klassnamn för det som är relaterat till Ui (det som berör Qwidget mm) och resten av prog? Detta under förutsättning att jag använder samma namn i ssd1306.ui och därmed i ui_ssd1306.h som Ui relaterade saker.

Källan, med fullständig kod.
https://hackaday.com/2014/01/02/qtledte ... /#comments
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: C++ Lost in classes

Inlägg av johano »

Om du nu verkligen _vill_ ha två olika klasser med samma namn, den ena i namespace:t "Ui", så behöver du deklarera
Ui::SSD1306 - du har nu bara gjort en "forward declaration", d.v.s. hintat kompilatorn om att det "kommer att finnas" en klass
med namnet Ui::SSD1306 så småningom...

T.ex. såhär:

Kod: Markera allt

namespace Ui {
class SSD1306 
{
 // fyll på med vad som behövs här...
};
}
Om nu detta _inte_ var fallet, så har Findecanor gett lösningen, inkludera hela klassdeklarationen inuti namespace-måsvingarna.

/j
idiotdea
Inlägg: 467
Blev medlem: 26 juli 2006, 16:11:34
Ort: Vasa, Finland
Kontakt:

Re: C++ Lost in classes

Inlägg av idiotdea »

Detta är en halvgissning, men kör qmake förrän make. Att inte ha hela klassdeklarationen inkluderad i headerfilen borde inte vara något problem då det endast finns länkar till ui-klassen.
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: C++ Lost in classes

Inlägg av Oltronix »

johano skrev:Om du nu verkligen _vill_ ha två olika klasser med samma namn...
Nä det är inget jag vill utan jag undrade om man måste göra så när man kör Qt, då det är lätt att bli förvirrad när det är samma namn för olika saker. Qt är lite knepig att förstå med alla sina macro.

I ui_ssd1306.h finns redan ett namespace Ui. Automatgenerat av Qt-designer.

Kod: Markera allt

.
.
QT_BEGIN_NAMESPACE
class Ui_SSD1306
{
.
.
namespace Ui {
    class SSD1306: public Ui_SSD1306 {};
} // namespace Ui

QT_END_NAMESPACE
ui_ssd1306.h

Vad QT_BEGIN_NAMESPACE och QT_END_NAMESPACE är för macro har jag ingen aning om

Edit:
Det finns andra designer som gör så här:

Kod: Markera allt

.
.
#include "ui_testform.h"

#include <QMainWindow>

class ThermoMeter;

class TestWidget : public QMainWindow,  private Ui::TestForm
    {
    	Q_OBJECT
.
.
test.h

Kod: Markera allt

.
.

TestWidget::TestWidget(QMainWindow *parent)
        : QMainWindow(parent)
    {
        initialize ();
 	connections();
    }

void TestWidget::initialize()
    {
      setupUi(this);
.
.
test.cpp

Det ser lite snyggare ut
Skriv svar