2013-02-22 53 views
1

当我编译下面的C++代码:C++中对象实例化的语法是什么?

#include "ConstantList.h" 

using namespace std; 

int main() { 

ConstantList* cl = new ConstantList(); 

//do something with cl 

delete cl; 
cl = NULL; 

return 0; 
} 

编译器给我的错误:

Undefined symbols: 
    "ConstantList::~ConstantList()", referenced from: 
     _main in ccNfeeDU.o 
    "ConstantList::ConstantList()", referenced from: 
     _main in ccNfeeDU.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

我没有获得用于实例化对象的语法对不对? 我ConstantList.h文件看起来像这样:

#ifndef ConstantList_h 
#define ConstantList_h 

#include <string> 
#include "Token.h" 


using namespace std; 

class ConstantListTail; 

class ConstantList { 
public: 
    ConstantList(); 
    ~ConstantList(); 

    std::string toString(); 

    void push_back(Token*); 
    void push_back(ConstantListTail*); 

private: 
    Token* termString; 
    ConstantListTail* constantListTail; 
}; 



#endif 

任何帮助,不胜感激!

+0

[“在G ++ Cpp中未定义的引用”的可能重复(http://stackoverflow.com/questions/6978241/undefined-reference-to-in-g-cpp) – 2013-02-22 17:40:33

回答

5

你的语法是正确的,因为你得到一个链接器错误,而不是编译器错误。这个错误意味着你正在编译您main没有ConstantList.cpp的来源,或不以ConstantList.o

参考使用该命令编译链接应该修复错误:

g++ collect2.cpp ConstantList.cpp 

(我假设的文件您的main功能称为collect2.cpp)。

+0

谢谢 - 最初我编译我的整个项目(72 .cpp和.h文件)与g ++ * .cpp。没有编译器错误。然后我试着运行它。所有它给了我一个Mac上的“总线错误”和Linux上的“无法执行二进制文件”。我研究过,有人认为这是由于无效的内存访问。所以我开始把我所有的指针都仔细研究。经过一些故障排除后,我试着独立编译每个文件,看看我的指针语法是否正确。不确定是否指针语法或对象实例化或其他原因导致该问题。再次感谢你的帮助! – ejsuncy 2013-02-22 19:05:50

2

“未定义的符号”是指已声明的标识符(在这种情况下,析构函数),它的使用,但只要链接器知道你有没有定义

定义添加的地方,并确保编译后的版本在文件中的一个链接链接


重“语法实例化”,不幸的是,在没有专门的语法C++

代替功能转换符号用于构造函数调用

也许你到了一个纯粹的语法实例最接近的是在头文件中new表达


重新

using namespace std; 

。例如,

标准库定义了一种叫做distance的东西。包含头部的某些代码将拥有自己的distance并得到名称冲突的可能性有多大?远高于零。

这并不意味着你不应该在头文件中有using namespace std;,但你永远不应该在头文件的全局名称空间中拥有它。对于其他名称空间,要非常了解它的功能,即提供所有标准库名称作为该名称空间的一部分。

+0

提及'使用命名空间'的+1 +1 – Arpit 2013-02-22 17:34:29

+0

谢谢!我正在学习来自java背景的C++。我很拼命地试图让这个代码只是编译,并用命名空间进行了故障排除。我忘了从头文件中删除它。 – ejsuncy 2013-02-22 19:00:41