2012-03-03 4 views
2

В моем задании на домашнее задание мне предлагается объявить класс встроенным, но я слышал только об объявлении функций inline. Что делает объявление встроенного класса, и как вы его достигаете?Как вы объявляете класс встроенным?

+0

Не могли бы вы задать вопрос по всему сайту? Честно говоря, «встроенный класс» может означать нечто большее. Например, объявление класса внутри класса или объявление класса внутри функции (оба из которых могут быть выполнены и иметь варианты использования). – StilesCrisis

+0

@StilesCrisis «Все объявления класса выражения должны отображаться в заголовочном файле с именем expression.hh (вы должны объявить все классы inline в этом заголовочном файле, так как это значительно облегчит жизнь каждому.)« –

+1

Я думаю они просто говорят, что ваши классы должны идти в заголовке, и для удобства все методы класса должны быть объявлены inline в самом классе, вместо того, чтобы помещать методы класса вне очереди или в отдельную CPP. Это немного неоднозначно, но я так и буду интерпретировать его. – StilesCrisis

ответ

5

Я думаю, что они просто говорят, что ваши классы должны идти в заголовке, и для удобства все методы класса должны быть объявлены inline в самом классе, вместо того чтобы помещать методы класса вне очереди или в отдельный CPP.

Немного двусмысленно, но я бы это интерпретировал.

+3

Точно, как я это интерпретирую. Но «сделать жизнь каждого намного проще» в приведенном выше комментарии не является правилом. Это может быть более удобно для очень маленьких классов, но в большинстве случаев это не выполняется. – Correa

2

Сравнение функций и классов:

Функция может иметь декларацию и определение:

ReturnType FunctionName(Parameter1, Parameter2); // a function declaration 

ReturnType FunctionName(Parameter1, Parameter2) // a function definition 
{ 
    // do something 
    return ReturnType; 
} 

Функция декларации дает всю информацию кому-то нужен, кто хочет, чтобы вызвать функцию.

Определение функции позволяет компилятору генерировать машинный код, так что, когда кто-то вызывает функцию, там будут инструкции где-то в исполняемом файле, который будет вызываться.

Этот сгенерированный код существует только один раз в исполняемом файле. Обычно вы помещаете определение функции в файл .cpp (или .c, если вы используете C, это тоже применяется), который скомпилирован и связан с исполняемым файлом. Если этот .cpp-файл не связан, вы получите сообщение об ошибке компоновщика FunctionName not found или что-то в этом роде.

Если вы поместите определение функции в заголовочный файл, более чем вероятно, что заголовок будет использоваться в нескольких местах в вашей системе и включен в другие .cpp-файлы. Это вызовет противоположную проблему во время соединения FunctionName already defined in this, that, or the other object file.

Таким образом, функции обычно не определены в заголовочных файлах, потому что заголовок обычно включается в несколько файлов .cpp, что приведет к созданию дублированного объектного кода.

С классами, однако, это немного отличается. У вас есть два разных способа определения функции для класса. Один из способов аналогично тому, как функции определены выше:

//myleanklass.h 
class MyLeanKlass 
{ 
public: 
    void perform(); 
}; 

//myleanklass.cpp 
void MyLeanKlass::perform() 
{ 
    // Sing, dance, and play the piano 
} 

Так же, как со свободной функцией, мы могли бы поместить определение в заголовочном файле, пока он не был включен в более чем один .cpp файл , В противном случае мы снова получим аналогичную ошибку компоновщика. void MyLeanKlass::perform already defined ... Этот сценарий не является нормой. Обычно вы объявляете классы, чтобы их можно было повторно использовать через систему. Таким образом, заголовок будет включен в несколько мест и приведет к ошибкам компоновщика.

Чтобы было ясно, мы могли бы поместить определение в заголовочный файл, но не inline. Вы не могли бы включить этот заголовок несколько раз в вашей системе:

class MyLeanKlass 
{ 
public: 
    void perform(); 
}; 

void MyLeanKlass::perform() 
{ 
    // Sing, dance, and play the piano 
} 

Наконец то, мы получаем ответ на вопрос. Вы можете определить функции класса в файле заголовка, если они находятся в объявлении класса. Это называется inline definition. Даже если заголовок включен в несколько файлов .cpp, он не приведет к нескольким определениям в единицах компиляции и не вызовет ошибок компоновщика.

//myleanklass.h 
class MyLeanKlass 
{ 
public: 
    void perform() 
    { 
     // Sing, dance, and play the piano 
    } 
}; 

Однако есть проблемы с этим подходом:

  • функции класса Inlining, скорее всего, чтобы сделать компиляцию займет больше времени, так как компилятор будет компилироваться каждый повторное определение функций класса и только выбросить дубликаты во время соединения.
  • Внесение изменений в функции класса вызывает перекомпиляцию любого .cpp-файла, который включает его, что опять-таки приводит к более длительному времени перекомпиляции.
  • Иногда это просто невозможно. Если класс использует другой класс и использует другой класс, у вас будет циклическая зависимость, и невозможно будет определить все встроенные. Вы можете решить это, просто поместив функции проблемы в отдельный .cpp-файл.
Смежные вопросы