【问题标题】:Undefined symbols ... operator new(unsigned long) [duplicate]未定义的符号...运算符新(无符号长)[重复]
【发布时间】:2014-11-17 07:50:42
【问题描述】:

我是在纯 C 中完成的,但现在我正在尝试在 C++ 中实现二叉搜索树。大多数代码完全相同,但我想使用new 运算符而不是malloc()。但是,我收到此错误:

Undefined symbols for architecture x86_64:
  "operator new(unsigned long)", referenced from:
      GetNewNode(int) in BstTreeV3-beb469.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是我在 ideone 上的代码。 Click here to view it.

Node* GetNewNode(int data) {
    Node *newNode = new Node();
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

void Insert(Node **root, int data) 
{
    if (*root == NULL) { // empty tree
        *root = GetNewNode(data);
    }
    else if ((*root)->data < data) {
        Insert(&((*root)->left), data);
    }
    else {
        Insert(&((*root)->right), data);
    }
}

我知道这可能不是最好的实现方法,但我只是在练习。如果您对如何实施 BST 有任何建议,请随时发表评论。

【问题讨论】:

  • 你的编译行是什么?
  • 如果你使用的是new(我希望还有delete),那么你不是在编写C语言,所以我删除了那个标签。这可能是您的链接失败的原因,因为您使用 clang 构建,它不与 C++ 运行时库链接,您应该使用 clang++ 构建,它会自动链接到 C++ 运行时库(或手动链接到C++ 运行时库)。
  • 啊,是的,Sublime 仍在使用我制作的 C 构建系统,而不是根据源文件类型自动使用 C++。我想知道为什么它不自动切换构建系统。我应该删除我原来的问题吗?
  • 一些编译器根据扩展名 .c 或 .cpp 决定是编译为 C 还是 C++。有些没有。但是除了编译器错误之外,您的代码中也存在基本设计问题,您需要将其转换为 OO 设计,如我的回答所示。

标签: c++ algorithm tree


【解决方案1】:

为了使程序有意义,它应该是这样的:

class Node
{
   private:
     int   data;
     Node* left;
     Node* right;

   public:

     Node()
       :data(0), left(NULL), right(NULL)
     {}

     Node(int d)
       :data(d), left(NULL), right(NULL)
     {}
};


...

*root = new Node(data);

如果你不使用这些语言特性,你还不如坚持使用 C。

尽管您得到的特定错误很可能来自使用 C 编译器编译 C++ 代码,正如您问题的 cmets 中所指出的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2013-01-08
    相关资源
    最近更新 更多