C ++中对象实例化的语法是什么?

时间:2013-02-22 17:27:04

标签: 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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

您的语法是正确的,因为您收到链接器错误,而不是编译器错误。此错误表示您正在编译main而没有ConstantList.cpp的来源,或者在没有引用ConstantList.o的情况下进行链接

使用此命令进行编译应修复错误:

g++ collect2.cpp ConstantList.cpp

(我假设您main函数的文件名为collect2.cpp}。

答案 1 :(得分:2)

“未定义的符号”表示您已声明了标识符(在本例中为析构函数),并且已使用它,但就链接器知道您尚未定义它而言

在某处添加定义,并确保已编译的版本位于链接器链接的文件之一


re“用于实例化的语法”,遗憾的是在C ++中没有专门的语法

而是功能强制转换表示法用于构造函数调用

您可能最接近纯实例化语法的是new表达式


RE

using namespace std;

在标题文件中:不要

例如,标准库定义了一个名为distance的东西。包含标题的某些代码有哪些机会拥有自己的distance,并获得名称冲突?远高于零。

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