Члены класса C ++ - PullRequest
       15

Члены класса C ++

1 голос
/ 16 декабря 2010

Я пришел с Java на C ++ ...

Когда я пытаюсь это сделать ...

class Box {
    Table* onTable;
};

class Table {
    Box* boxOnIt;
};

int main() {
    Table table;
    Box box;

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

    return 0;
}

компилятор говорит мне, что таблица не определена. Если я переключаю определения классов, компилятор говорит мне, что Box не определен

В Java я смог сделать что-то подобное без проблем. Есть ли решение для этого, чтобы работать? спасибо ...

Ответы [ 7 ]

2 голосов
/ 16 декабря 2010

У вас есть круговая зависимость, и вам нужно переслать, чтобы объявить один из классов:

// forward declaration
class Box;

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

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

Обратите внимание, что, вообще говоря, у нас будет отдельный заголовочный файл для Box и Table, с использованием предварительных объявлений в обоих, например:

box.h

class Table;

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

table.h

class Box;

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

Затем включите необходимый файл в наши файлы реализации (.cpp):

box.cpp

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

table.cpp

#include "box.h"
#include "table.h"
2 голосов
/ 16 декабря 2010

Добавьте это перед классом Box:

class Table;

Таким образом, вы forward объявляете таблицу классов, чтобы указатель на нее можно было использовать в Box.

2 голосов
/ 16 декабря 2010

вы должны использовать форвардные объявления .просто упомяните это как первое утверждение:

class Table;  // Here is the forward declaration
1 голос
/ 16 декабря 2010

Используйте предварительные объявления, чтобы класс, объявленный первым, знал о втором.http://www.eventhelix.com/realtimemantra/headerfileincludepatterns.htm

1 голос
/ 16 декабря 2010

Вы должны заранее объявить один из двух классов:

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;
}

или наоборот:

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;
}
1 голос
/ 16 декабря 2010
class Table;

class Box {
    Table* onTable;
};

class Table {
    Box* boxOnIt;
};

int main() {
    Table table;
    Box box;

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

    return 0;
}
0 голосов
/ 16 декабря 2010

Добавьте определение класса вверху

class Table;

class Box {
    Table* onTable;
};

class Table {
    Box* boxOnIt;
};
...