c++ private:使用不同类中的方法调用的inclass setter初始化静态类成员返回错误-未解析的符号[duplicate]

bfrts1fy  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(98)

此问题在此处已有答案

Undefined reference to static class member(9个答案)
四个月前关门了。
此帖子已在2天前编辑并提交审核,无法重新打开帖子:
原始关闭原因未解决

  • 这个问题在概念上是重复的,但是错误的表达方式不同。未解析的符号应该被理解为未定义的引用。如果你是C++的新手,请花点时间阅读我的代码生成的错误。*

我正在学习一门C++和OOP课程,我需要一些帮助来了解我做错了什么以及我可以做些什么来纠正它。我有一个代码框架,在那里我不能通过将类成员从静态改为非静态来更改它们。在我当前的讲义中,我需要在第二个类中创建第一个类的对象。并调用第一个类中的一个方法。我不能将类成员从private移动到public或public移动到private,也不能将它们从static更改为non-static。我的目标是在第二个类中编写方法,使用第一个类中的setter和getter,使用第二个类别中的对象,并在int main()中呼叫第二个类别中的方法。
下面是我在尝试我所描述的内容时所写的基本想法。

#include <iostream>

using namespace std;

class foo
{
private:
    static string goo;
    static long int doo;
public:
    static void setGoo(string gooString)
    {
        goo = gooString;
    }
    static void setDoo(long int dooLongInt)
    {
        doo = dooLongInt;
    }
    static string getGoo()
    {
        return goo;
    }
    static long int getDoo()
    {
        return doo;
    }
};

class moo
{
private:
    foo fooObj;
public:
    void setGoo(string gooString)
    {
        fooObj.setGoo(gooString);
    }
    void setDoo(long int dooLongInt)
    {
        fooObj.setDoo(dooLongInt);
    }
    string getGoo()
    {
        return fooObj.getGoo();
    }
    long int getDoo()
    {
        return fooObj.getDoo();
    }
};

int main()
{
    moo mainMoo;
    string text = "Text";
    mainMoo.setGoo(text);
    mainMoo.setDoo(123);
    cout << mainMoo.getGoo();
    cout << mainMoo.getDoo();
    return 0;
};

当我编译它时,我得到这些错误。

1>Source.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > foo::goo" (?goo@foo@@0V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)
1>Source.obj : error LNK2001: unresolved external symbol "private: static long foo::doo" (?doo@foo@@0JA)
1>C:\Users\ipyra\OneDrive\Documents\edx hands-on projects\Static class private member initialization\x64\Debug\Static class private member initialization.exe : fatal error LNK1120: 2 unresolved externals
vltsax25

vltsax251#

类的静态成员需要在类外初始化,这就是链接错误的原因。

class foo
{
private:
    static string goo;
    static long int doo;
public:
    // .... other code
};
string foo::goo = "";
long int foo::doo = 0;

在C++17中使用inline关键字,我们可以在类内部定义静态成员。http://en.cppreference.com/w/cpp/language/static
另一个类似的问题How to initialize private static members in C++?

相关问题