Проблема при компиляции кода C ++ с Xcode - PullRequest
0 голосов
/ 28 февраля 2011

Я пытался скомпилировать некоторый код C ++ в XCode, и я получил эту ошибку:

Undefined symbols:
  "Editorial::sm_nTotalEditorials", referenced from:
      Editorial::AskTotal()     in editorial.o
      Editorial::~Editorial()in editorial.o
      Editorial::~Editorial()in editorial.o

Список следует с еще двумя записями для деструктора и еще четырьмя записями для конструктора (я считаю, что это единственные функции, в которых я использую sm_nTotalEditorials). Я прилагаю определение переменной и функции, в которых я ее использую.

class Editorial
{
private:
     static int         sm_nTotalEditorials;
     ...
}

int Editorial::AskTotal() {return sm_nTotalEditorials;}

Editorial::~Editorial()
{
    if (!m_pPrev) sm_pFirstEditorial=m_pNext;
    if (m_pPrev) (*m_pPrev).SetContext((*m_pPrev).AskPrev(),m_pNext);
    if (m_pNext) (*m_pNext).SetContext(m_pPrev,(*m_pNext).AskNext());
    sm_nTotalEditorials--;
}

Затем он печатает аналогичную ошибку с другими 3 статическими закрытыми переменными, которые я использую. Должно быть, я все испортил со статическим использованием. Это мой первый код на C ++, поэтому я прошу прощения за любой неправильный синтаксис или за слишком глупый вопрос; Я пытался искать в Интернете, но ошибка, напечатанная XCode, довольно неоднозначна, и согласно учебникам, которые я видел, я использую все, как и должно быть. Кроме того, код достаточно длинный, чтобы напечатать все это, и я вставил части, где, по моему мнению, должна быть ошибка, но опять же я тоже не уверен в этом.

Ответы [ 2 ]

1 голос
/ 01 марта 2011

В C ++ создание статического члена данных для класса является двухэтапным процессом. Во-первых, вы должны объявить переменную, что вы сделали здесь. Однако вы также должны определить его где-нибудь, чтобы компилятор знал, куда поместить место для хранения переменной. Обычно это делается в файле .cpp для класса. В файле .cpp попробуйте добавить следующую строку:

int Editorial::sm_nTotalEditorials = 0;

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

Обратите внимание, что при создании таких определений вы не повторяете ключевое слово static; это даст статическую связь статическому полю, что не решит проблему.

0 голосов
/ 01 марта 2011

Это компилируется как код C ++? Я помню, что читал, что файл будет нуждаться в расширении .mm, чтобы отличить его от obj-c. Существует также раскрывающийся тип файла на странице «Информация» для файла в Xcode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...