我正在尝试从类文件运行一个函数,但它无法正常工作,我收到以下错误消息: 错误LNK1120:1个未解析的外部
错误LNK2019:未解析的外部符号“public:void __thiscall NS :: Class1 :: test(void)”(?test @ Class1 @ NS @@ QAEXXZ)在函数_main中引用
//Main.cpp
#include<iostream>
#include<string>
#include<Windows.h>
#include "Class1.h"
int main(){
NS::Class1 E;
E.test();
return 0;
};
//Class1.cpp
#include <Windows.h>
#include <string>
namespace NS{
class Class1{
Class1(){
OutputDebugString(L"Created.");
}
void test(){
OutputDebugString(L"Hello World");
}
};
}
//Class1.h
#ifndef _Class1_H_
#define _Class1_H_
namespace NS{
class Class1{
public:
void test();
};
}
#endif
答案 0 :(得分:6)
在源文件中,您正在重新定义类,而不是定义其成员函数。这将给出未定义的行为,因为您只允许定义一次类。源文件看起来应该更像:
#include "Class1.h"
#include <Windows.h>
NS::Class1::Class1(){
OutputDebugString(L"Created.");
}
void NS::Class1::test(){
OutputDebugString(L"Hello World");
}
您还需要修改标头中的类定义,因为它不会声明构造函数。
另外,请确保您的项目正在编译和链接两个源文件。
答案 1 :(得分:1)
您的头文件包含include guard的保留ID,并且错过了构造函数的声明。它应该是这样的:
#ifndef CLASS1_H
#define CLASS1_H
namespace NS {
class Class1
{
public:
Class1();
void test();
};
}
#endif
该类的定义不应包含class
声明,它应该include
,并且应该更像这样:
#include <Windows.h>
#include "Class1.h"
namespace NS {
Class1::Class1()
{
OutputDebugString(L"Created.");
}
void Class1::test()
{
OutputDebugString(L"Hello World");
}
}
答案 2 :(得分:0)
我认为您的.cpp文件可能会导致此问题。由于您已经使用类成员声明在头文件中创建了类定义,因此只需在Class1.cpp文件中导入Class1.h标头,然后定义成员函数,然后定义它们的行为。
所以也许试试:
#include <Class1.h>
NS::Class1::Class1(){}//constructor
void NS::Class1::test(std::cout << "hi"){}