我试图在Xcode中编译一些C ++代码,我收到了这个错误:
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打印的错误很模糊,根据我看过的教程,我正在使用它应该使用的所有内容。此外,打印所有内容的代码都很长,而且我将这些部分粘贴在我认为错误的位置,但我也不确定。
答案 0 :(得分:1)
在C ++中,为类创建静态数据成员需要两个步骤。首先,你必须声明你在这里完成的变量。但是,您还必须在某处定义它,以便编译器知道将变量的存储空间放在何处。通常,这是在类的.cpp文件中完成的。在.cpp文件中,尝试添加以下行:
int Editorial::sm_nTotalEditorials = 0;
这为编译器提供了所需的定义,因此您不会再有任何链接器错误抱怨缺少定义。您也可能希望为其他静态数据成员执行此操作。
请注意,在制作这些类型的定义时,不要重复使用static关键字;这将给静态字段静态链接,这将无法解决问题。
答案 1 :(得分:0)
它是作为c ++代码编译的吗?我记得读过该文件需要一个.mm扩展名来区分obj-c。 "获取信息"还有一个文件类型下拉列表。 Xcode中文件的页面。