2017-02-12 2 views
0

Я пишу в C++, и мой код становится все больше и больше. Интересно, могу ли я как-то переместить фрагмент кода в другой файл. Скажем, у меня есть:Как переместить фрагмент кода в другой файл в C++?

class First { 
    class Second 
    { 
     void a(); 
     void b(); 
    }; 
    void c(); 
}; 

Я хотел бы переместить мой второй класс к Second.h файл, а затем, конечно, написать тела второго класса и функции в Second.cpp файл. Как я могу это сделать?

+0

.... попробуйте скопировать и вставить? Извините, не совсем ясно, что вы спрашиваете, что вы пробовали, какие у вас проблемы и т. Д. –

+0

Почему вы хотите/нуждаетесь в таком разделении? Можете ли вы подробно рассказать о своем фактическом использовании? –

ответ

0

Учитывая, что class Second вложен в class First вы могли бы начать с рефакторинга кода следующим образом:

class First 
{ 
    class Second; 
    void c(); 
}; 
class First::Second 
{ 
    void a(); 
    void b(); 
}; 

Оттуда легко сломать два класса в отдельные файлы:

First.h:

class First 
{ 
    class Second; 
    void c(); 
}; 

И Second.h

#include "First.h" 

class First::Second 
{ 
    void a(); 
    void b(); 
}; 

И тогда ваши .cpp файлы будут:

First.cpp

#include "First.h" 
void First::c() 
{ 

} 

Second.cpp

#include "Second.h" 
void First::Second::a() 
{ 

} 

void First::Second::b() 
{ 

} 
+0

Спасибо, это то, что я имел в виду. Я последовал твоему пути. Теперь я хотел создать объект моего второго класса (в первом классе), однако мой компилятор выдает ошибку: «Неполный тип не разрешен», а «Первый :: использует не определенный класс First :: Second», несмотря на мой второй класс HAS тело, как в вашем коде. Вы знаете, может быть, почему я не могу создать объект? – Adas

+0

К сожалению, нет хорошего способа сделать это. Это один из недостатков вложенных классов, особенно когда они так разбиты. Если бы мне пришлось предположить, что я просто оставил бы «First» и «Second» в том же заголовке. Это будет похоже на первый фрагмент кода в моем примере. У вас могут быть реализации в отдельных файлах '.cpp'. Проблема заключается в том, что 'First' не имеет полного объявления' Second' в своем заголовке, только для прямого объявления. –

+0

@Adas Почему вы используете вложенные классы в первую очередь? Вы уверены, что не хотите, чтобы * экземпляр * из 'Second' был * членом *' First'?Кроме того, если вы разложите код таким образом, то пользователям 'First' нужно будет включить' Second.h'. Чтобы этого избежать, поместите '#include Second.h' в * bottom * из' First.h' и убедитесь, что вы добавили [include guard] (https://en.wikipedia.org/wiki/Include_guard). –

0

Давайте предположим, что у вас есть First.h

class First{ 
    class Second 
    { 
     void a(); 
     void b(); 
    }; 
    void c(); 
}; 

вы можете обеспечить реализацию class Second в отдельном ЕП: как

First.cpp:

#include "First.h" 
void First::c() { 
} 

Second.cpp:

#include "First.h" 

void First::Second::a() { 
} 
void First::Second::b() { 
} 

Я не уверен, что это то, что вам нужно.

+0

Большое спасибо, это в значительной степени то, что я хотел – Adas

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