如何正确包含 Header 和实现文件?

How to properly include Header and Implementation Files?

我是c++的新手程序员,目前遇到编译错误

Undefined symbols for architecture x86_64

据推测,这源于 header 文件和实现文件 included/coded。

下面是一些生成我收到的编译错误的代码


主要

//Main.cpp
#include <iostream>
#include <string>
#include "Animal.hpp"

using namespace std;

int main(){
    Animal myPet;
    myPet.shout();

    return 0;
}

Header

//Animal.hpp
#ifndef H_Animal
#define H_Animal

using namespace std;

#include <string>

class Animal{
public:
    Animal();

    void shout();
private:
    string roar;
};
#endif

实施

//Animal.cpp
#include "Animal.hpp"
#include <string>

Animal::Animal(){
    roar = "...";
}

void Animal::shout(){
    roar = "ROAR";
    cout << roar;
}

这段代码导致了我的编译问题。如何解决这个问题?

感谢您的宝贵时间


编辑

Undefined symbols for architecture x86_64:
  "Animal::shout()", referenced from:
      _main in test-5f7f84.o
  "Animal::Animal()", referenced from:
      _main in test-5f7f84.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在你的代码中只能找到一个错误,你的编译器应该已经告诉你那个错误了。

Animal.cpp 中,您正在使用 std::cout 但您没有 #include 使用 <iostream>。你 #include 它在 Main.cpp 但那里不需要它。

如果您(真的)想在 Animal.cpp 中将 std::cout 称为 cout,您还必须在该文件中添加一个 using namespace std 指令。

header 文件 (Animal.hpp) 中的 using 指令是邪恶的。摆脱它并输入 std::string 代替。将 using 指令放入 headers 会乱丢所有使用它的文件的命名空间。

我也不明白你对 roar 成员的意图。每次调用 shout 时,在构造函数中为它分配 "..." 并为它分配 re-assigning "ROAR" 有什么意义?难道你不能没有那个变量而只拥有

void
Animal::shout()
{
  std::cout << "ROAR\n";
}

?我添加了一个换行符,因为你可能想要一个。

@JamesMoore 解决了我在这个编码项目中遇到的主要问题。

"@Nicholas Hayden 好吧,如果你有三个文件,test.cpp(有 main),animal.cpp,和 animal.hpp。命令应该是 g++ animal.cpp test.cpp。您需要编译所有源文件。“

我目前没有使用 IDE。所以,当我调用编译器编译我的 main.cpp - 这是编译实现文件的问题。

g++ test.cpp

需要成为

g++ test.cpp animal.cpp

这将调用编译器编译程序所需的一切。

也许您可能想查看另外一组您的 3 个文件,其中内容更多 "sorted",您知道,内容被放置在它们 "really" 所属的位置。

所以这是 "new" 头文件..

//Animal.hpp
#ifndef H_Animal
#define H_Animal

#include <string> // suffices

// Interface.
class Animal {
    std::string roar; // private

public:
    Animal();
    void shout();
};

#endif

然后是源文件..

//Animal.cpp
#include "Animal.hpp"

#include <iostream> // suffices

// Constructor.
Animal::Animal()
    :
    roar("...") // data member initializer
{}

// Member function.
void Animal::shout() {
    roar = "ROAR";
    std::cout << roar;
}

和主程序..

//Main.cpp
#include "Animal.hpp"

int main(){
    Animal thePet;
    thePet.shout(); // outputs: `ROAR'
}

加一点 GNU makefile ..

all: default run

default: Animal.cpp Main.cpp
    g++ -o Main.exe Animal.cpp Main.cpp

run:
    ./Main.exe

clean:
    $(RM) *.o *.exe

开始,只需在命令行中输入 "make"。你喜欢它吗? -- 此致,M.