如何正确地包含头文件和实现文件
How to properly include Header and Implementation Files?
我是一个c++新手,我现在得到一个编译错误
Undefined symbols for architecture x86_64
据推测,这源于头文件和实现文件的包含/编码方式。
下面是一些生成编译错误的代码,我收到
主要
//Main.cpp
#include <iostream>
#include <string>
#include "Animal.hpp"
using namespace std;
int main(){
Animal myPet;
myPet.shout();
return 0;
}
头
//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)
也许你可能想要看到你的3个文件的另一组,其中的东西更"排序",你知道,在那里的东西被放在他们"真正"属于的地方。
所以这是"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 .
我只能在你的代码中找到一个错误,你的编译器应该告诉你这个错误。
在Animal.cpp
中,您使用的是std::cout
,而不是#include
和<iostream>
。您在Main.cpp
中#include
它,但那里不需要它。
如果你(真的)想在Animal.cpp
中将std::cout
称为cout
,你还必须在该文件中添加一个using namespace std
指令。
头文件中的using
指令(Animal.hpp
)是邪恶的。去掉它并输入std::string
。将using
指令放在头文件中会破坏所有使用它的文件的命名空间。
我也不明白你对roar
成员的意图。在构造函数中将"..."
赋值给它,并在每次调用shout
时将"ROAR"
重新赋值给它,这有什么意义?你能不能去掉这个变量,只写
void
Animal::shout()
{
std::cout << "ROARn";
}
?我添加了一个换行符,因为您可能需要。
我在这个编码项目中遇到的主要问题是由@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
这将调用编译器来编译程序所需的所有内容。
- 在实现文件中使用头文件的通用 lambda
- 在文件上实现迭代器
- C++头文件和类实现出现问题
- 在文件夹迭代上实现 RAII
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- 用于 Windows 写入临时文件的 mkstemp() 实现
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 在实现文件中使用模板参数声明方法
- 在头文件中使用opencv类型来实现未定义的标识符
- 模板实现文件中的匿名命名空间
- 创建单独的实现文件和头文件
- 多文件类实现Cpp
- Reader类实现中的文件读取错误
- MEX文件实现特征库伪内函数崩溃
- openssl rc4 命令行加密和 cpp 文件实现 rc4 之间的区别
- 从其他头文件实现结构
- c++头文件-实现-头文件-实现依赖链
- 内存映射文件实现