【问题标题】:How do I run a function from a class file in C++?如何从 C++ 中的类文件运行函数?
【发布时间】:2013-10-10 15:48:36
【问题描述】:

我正在尝试从类文件中运行一个函数,但它不起作用,并且我收到以下错误消息: 错误 LNK1120:1 个未解决的外部问题

错误 LNK2019:函数 _main 中引用的未解析的外部符号“public: void __thiscall NS::Class1::test(void)”(?test@Class1@NS@@QAEXXZ)

//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

【问题讨论】:

  • 你是如何编译和链接你的.cpp文件的?

标签: c++


【解决方案1】:

在您的源文件中,您正在重新定义类,而不是定义其成员函数。这将给出未定义的行为,因为您只能定义一次类。源文件应该看起来更像:

#include "Class1.h"
#include <Windows.h>

NS::Class1::Class1(){
    OutputDebugString(L"Created.");
}

void NS::Class1::test(){
    OutputDebugString(L"Hello World");
}

您还需要修改标头中的类定义,因为它没有声明构造函数。

另外,请确保您的项目正在编译和链接两个源文件。

【讨论】:

    【解决方案2】:

    您的头文件包含包含保护的保留 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");
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      我认为您的 .cpp 文件可能会导致问题。由于您已经使用类成员声明在头文件中创建了类定义,因此只需在 Class1.cpp 文件中导入 Class1.h 头文件并确定成员函数的范围,然后定义它们的行为。

      所以不妨试试:

      #include <Class1.h>
      
      NS::Class1::Class1(){}//constructor
      
      void NS::Class1::test(std::cout << "hi"){}
      

      【讨论】:

      • #include 到底是什么?你能整理一下答案的格式吗?
      • 对不起,我的意思是 #include "Class1.h" 作为上述检查的答案。检查的答案非常好和正确。比我的更精致:)
      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2013-07-04
      • 2019-10-07
      • 2012-08-17
      • 1970-01-01
      相关资源
      最近更新 更多