【问题标题】:Using data structure methods in main class c++c++主类中使用数据结构方法
【发布时间】:2017-07-11 22:18:57
【问题描述】:

我正在尝试在我的 main 方法中访问 Element 结构中的方法。我不断收到错误提示

“架构 x86_64 的未定义符号:

“Element::Element()”,引用自:

Element.o 中的_main

main.o 中的_main

ld:未找到架构 x86_64 的符号

clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看 调用)"

元素标题

#ifndef Element_hpp
#define Element_hpp

struct Element {
public:
    int getNumber(void);
    void setNumber(int n);
    int getSteps();
    void setSteps();
    Element();
private:
    int number;
    int stepN;
};

#endif /* Element_hpp */

元素类

#include "Element.hpp"
#include "main.cpp"

int Element::getNumber() {
    return number;
}

void Element::setNumber(int n) {
    number = n;
    setSteps();
}

int Element::getSteps() {
    return stepN;
}

int steps(int n) {
    int i = 0;
    int j = n;
    while(j != 1) {
        if(j % 2 == 1) {
            j = (3 * j + 1) / 2;
            i = i + 2;
        }
        else if(j % 2 == 0) {
            j= j / 2;
            i= i + 1;
        }
    }
    return i;
}

void Element::setSteps() {
    stepN = steps(number);
}

主类

#include <iostream>
#include <String>
#include <fstream>
#include "Element.hpp"


int main(int argc, const char * argv[]) {
    std::ofstream data;
    data.open("data.txt");
    int end = 1000;
    Element* e = new Element[end];
    for(int i = 0; i < end; i++) {
        e[i].setNumber(i);
        e[i].setSteps();
    }
    heapSort(e, end);
    printArray(e, end);
    data.close();
    return 0;
}

【问题讨论】:

  • 这太明显了。您声明但未能定义类的构造函数。你到底有什么不明白的地方?
  • 你如何编译和链接你的代码?您使用的是命令行还是 IDE?您是否使用了诸如 make 之类的任何构建?

标签: c++


【解决方案1】:

您已在 Element 头文件中声明了 Element(); 构造函数,但您尚未在任何文件中定义它。

您可能希望将其添加到您的 Element 实现文件中:

Element::Element() {
}

【讨论】:

    【解决方案2】:

    正如评论中提到的Sam Varshavchik,您声明了

    Element::Element()
    

    在您的 Element 头文件上,但没有定义它。添加

    Element::Element() {
    }
    

    到您的 Element 类文件应该允许链接器找到丢失的符号。

    【讨论】:

      【解决方案3】:

      您永远不应该#include CPP 文件。相反,您应该链接它们。最直接的方式是从命令行:

      $ g++ main.cpp element.cpp
      

      我建议您阅读 C++ 构建过程,包括编译和链接之间的区别。

      【讨论】:

      • 虽然是这样,但这并不能回答问题,与链接失败无关。
      • @SamVarshavchik 我看到了声明,但错过了没有匹配的定义。
      猜你喜欢
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多