【问题标题】:C++ unresolved external symbolC++ 未解析的外部符号
【发布时间】:2013-02-28 11:52:42
【问题描述】:

嗨,我是 c++ 的初学者,我有一个带有静态方法的类,但我无法访问它们,这会引发错误

    1>------ Build started: Project: CPractice, Configuration: Debug Win32 ------
1>  Source.cpp
1>Source.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > CPractice::name" (?name@CPractice@@0V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)
1>c:\users\innersoft\documents\visual studio 2012\Projects\CPractice\Debug\CPractice.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这是我的代码

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string>

using namespace std;

class CPractice
{
    public:
        static void setName(string s)
        {
            name = s;
        }
        static string getName()
        {
            return name;
        }
    private:
        static string name;
};


int main()
{


    CPractice::setName("Name");
    cout << "\n" << CPractice::getName();
    system("PAUSE");
    return EXIT_SUCCESS;
}

【问题讨论】:

    标签: c++ class variables static


    【解决方案1】:
    static string name;
    

    因为它是static,这一行只有声明 name - 你也需要定义它。只需将其放在您的类定义下方:

    string CPractice::name;
    

    如果您最终将类移动到相应的头文件和实现文件中,请确保将此定义放在实现文件中。它应该只在一个翻译单元中定义。

    【讨论】:

    • 我认为它在我宣布它的时候已经定义好了。它的作品,非常感谢
    • @SilvioMarijic 这是人们常犯的错误。它不是定义的原因是避免有多个定义。如果它是一个定义,并且您将它所在的标头包含在许多其他文件中,那么您将拥有同一个静态成员的多个定义。无论如何,不​​要忘记通过接受对您帮助最大的答案表示感谢。
    【解决方案2】:

    你只在类中声明了name,静态变量需要在类外这样定义:

    string CPractice::name ="hello" ;
    

    【讨论】:

      【解决方案3】:

      因为 name 是一个 static 数据成员,你应该初始化它 :) 而不是依赖于默认实例相关的构造函数。

      在类定义之后添加它(是的,我知道它令人困惑,因为您的成员是私有成员,但这只是一个初始化):

      string CPractice::name;
      

      【讨论】:

        【解决方案4】:

        我认为您正在尝试使用gcc 进行编译,而您应该使用g++ 进行编译。有关更多信息,请参阅What is the difference between g++ and gcc?

        您还需要在类定义下方添加string CPractice::name;

        【讨论】:

          猜你喜欢
          • 2012-11-19
          • 1970-01-01
          • 2012-12-17
          • 2012-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多