2010-12-16 2 views
1

Я пришел из Java в C++ ...C++ члены класса

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

class Box { 
    Table* onTable; 
}; 

class Table { 
    Box* boxOnIt; 
}; 

int main() { 
    Table table; 
    Box box; 

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

    return 0; 
} 

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

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

+0

Мне интересно, что ни один ответ не упоминал о том, что вы должны объявить свою недвижимость публичной, если вам нужно получить к ней доступ извне класса.Члены класса неявно закрыты в C++, и поэтому вы должны получить ошибку компилятора из кода при попытке доступа к `boxOnIt` или `onTable`. – Kleist 2010-12-16 17:29:28

ответ

2

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

// 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" 
+0

Большое спасибо, теперь код работает. – Mustafa 2010-12-16 11:05:11

2

Вы должны использовать forward declarations. просто упомянуть об этом в качестве первого оператора:

class Table; // Here is the forward declaration 
+1

и сделать привычкой создавать отдельный (заголовочный) файл для каждого объекта. box.h и table.h и включить их в файл main.cpp – RvdK 2010-12-16 10:52:01

2

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

class Table; 

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

1
class Table; 

class Box { 
    Table* onTable; 
}; 

class Table { 
    Box* boxOnIt; 
}; 

int main() { 
    Table table; 
    Box box; 

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

    return 0; 
} 
1

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

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

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

class Table; 

class Box { 
    Table* onTable; 
}; 

class Table { 
    Box* boxOnIt; 
}; 
+1

Это объявление, которое вам нужно наверху, а не определение. – Kleist 2010-12-16 17:26:28

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

  • Нет связанных вопросов^_^