我正在尝试为一个简单的c ++程序创建头文件,实现文件和主文件,该程序使用gethostname()
返回系统主机名。
声明我的类,数据和方法的头文件
//hostname.h
#pragma once
namespace hostnamespace
{
class hostname_class
{
public:
hostname_class();
void to_string();
private:
char *name;
};
}
定义我的类和方法的实现文件
//hostname_class.cpp
#include "hostname.h"
#include <iostream>
#include <unistd.h>
#include <limits.h>
using namespace hostnamespace;
using namespace std;
class hostname_class{
private:
char *name;
public:
hostname_class(){
gethostname(name, HOST_NAME_MAX);
}
void to_string(){
cout << "Hostname:" << &name << endl;
}
};
我的主程序文件
//hostname_main.cpp
#include "hostname.h"
#include <iostream>
using namespace hostnamespace;
int main() {
hostname_class host;
host.to_string();
return 0;
}
当我尝试运行g++ -o main hostname_main.cpp hostname_class.cpp
我收到此错误
/bin/ld: /tmp/ccGfbyuu.o: in function `main':
hostname_main.cpp:(.text+0x1f): undefined reference to `hostnamespace::hostname_class::hostname_class()'
/bin/ld: hostname_main.cpp:(.text+0x2b): undefined reference to `hostnamespace::hostname_class::to_string()'
collect2: error: ld returned 1 exit status
任何帮助将不胜感激。
答案 0 :(得分:4)
您要在全局名称空间中重新声明hostname_class,而不是在您想要的名称空间中定义它。
如何编写hostname_class.cpp文件的示例结构。
#include <iostream>
#include <unistd.h>
#include <limits.h>
#include "hostname.h"
using namespace std;
namespace hostnamespace
{
hostname_class::hostname_class() {
gethostname(name, HOST_NAME_MAX);
}
void hostname_class::to_string() {
cout << "Hostname:" << name << endl;
}
};
一个要点-我逐字地复制了您的方法实现。它将编译。但是name
肯定是未初始化的,并且在将其传递到gethostname
时指向未定义的内存地址。那可能不是很好。