【问题标题】:What wrong with class destructor symbol ? in vc++类析构函数符号有什么问题?在vc++中
【发布时间】:2011-08-08 17:07:09
【问题描述】:

这是我的代码:

   #include <iostream>
using namespace std;

class new_class{
public:
    new_class();
    float multiplication(){return x*y;}
    ~new_class();
private:
    float x;
    float y;
};

int main()
{   new_class class_11;
    cout<<class_11.multiplication()<<endl;
   system("pause");


   return 0;
}

错误日志:

Main.obj : error LNK2001: unresolved external symbol "public: __thiscall new_class::~new_class(void)" (??1new_class@@QAE@XZ)
Main.obj : error LNK2001: unresolved external symbol "public: __thiscall new_class::new_class(void)" (??0new_class@@QAE@XZ)

我使用的是 Visual Studio 2010,Visual C++ 谁能解释我 我做错了什么?

【问题讨论】:

    标签: c++ class destructor symbols


    【解决方案1】:

    你还没有定义你的构造函数或析构函数,你只是声明了它们。

    程序中使用的任何函数都必须在某个地方定义。函数定义由函数声明和其定义组成。例如,您的multiplication 成员函数已定义:

    float multiplication() { return x * y; }
    ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
    function declaration   this makes the declaration a definition
    

    “未解析的外部符号”错误意味着编译器找到了函数的声明,但链接器无法找到定义。因此,您需要为链接器记录的两个函数提供定义:默认构造函数和您声明的析构函数。

    也就是说,请注意,如果您不声明任何构造函数,编译器将为您的类隐式提供默认构造函数,这通常就足够了。如果不声明析构函数,编译器将隐式提供析构函数。所以,除非你真的需要在构造函数或析构函数中做一些事情,否则你不需要自己声明和定义它们。

    确保您拥有a good introductory C++ book。这样的书将更详细地介绍如何定义成员函数以及编写构造函数和析构函数的最佳实践(正确编写析构函数充满危险)。

    【讨论】:

    • 这些问题只有在您决定使用该课程时才会出现;)
    • @Petesh:是的,并且OP通过声明new_class类型的自动变量来使用构造函数和析构函数。
    【解决方案2】:

    你应该实现析构函数,你刚刚声明了它

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 2018-09-17
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2023-04-06
      • 2013-10-29
      相关资源
      最近更新 更多