Domanda

Sono venuto da Java a C ++ ...

Quando provo a fare questo ...

class Box {
    Table* onTable;
};

class Table {
    Box* boxOnIt;
};

int main() {
    Table table;
    Box box;

    table.boxOnIt = &box;
    box.onTable = &table;

    return 0;
}

il compilatore mi dicono che Tabella non è definito. Se posso passare definizioni di classe il compilatore mi dicono che di sicurezza non è definita

In Java ero in grado di fare qualcosa di simile senza alcun problema. C'è una soluzione per questo al lavoro? grazie ...

È stato utile?

Soluzione

Hai una dipendenza circolare qui e necessità di inoltrare a dichiarare una delle classi:

// forward declaration
class Box;

class Table
{
    Box* boxOnit;
}  // eo class Table

class Box
{
    Table* onTable
} // eo class Box

Si noti che, in generale, avremmo un file di intestazione separato per Box e Table, utilizzando le dichiarazioni a termine in entrambi, per esempio:

box.h

class Table;

class Box
{
    Table* table;
}; // eo class Box

table.h

class Box;

class Table
{
    Box* box;
};  // eo class Table

Quindi, includere il file necessario nella nostra implementazione file (cpp):

box.cpp

#include "box.h"
#include "table.h"

table.cpp

#include "box.h"
#include "table.h"

Altri suggerimenti

dichiarazioni previsionali . a citare questa come prima dichiarazione:

class Table;  // Here is the forward declaration

Aggiungi questo prima classe Box:

class Table;

In questo modo si dichiarare avanti classe tabella in modo che puntatore ad esso può essere utilizzato in sicurezza.

class Table;

class Box {
    Table* onTable;
};

class Table {
    Box* boxOnIt;
};

int main() {
    Table table;
    Box box;

    table.boxOnIt = &box;
    box.onTable = &table;

    return 0;
}

Utilizzare le dichiarazioni previsionali in modo che la classe dichiarata prima conosce la seconda. http://www.eventhelix.com/realtimemantra/headerfileincludepatterns.htm

Si dovrebbe inoltrare dichiarare uno dei due classi:

class Table; // forward declare Table so that Box can use it.

class Box {
    Table* onTable;
};

class Table {
    Box* boxOnIt;
};

int main() {
    Table table;
    Box box;

    table.boxOnIt = &box;
    box.onTable = &table;

    return 0;
}

o viceversa:

class Box; // forward declare Box so that Table can use it.

class Table {
    Box* boxOnIt;
};

class Box {
    Table* onTable;
};

int main() {
    Table table;
    Box box;

    table.boxOnIt = &box;
    box.onTable = &table;

    return 0;
}

Aggiungi classe definizione sulla parte superiore

class Table;

class Box {
    Table* onTable;
};

class Table {
    Box* boxOnIt;
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top