簡體   English   中英

無法調用其他類-ERR-未解析的外部符號

[英]Cannot Call Another Class - ERR - Unresolved External Symbol

我正在嘗試從main.cpp調用Raw類中的另一個函數foo(),但我不斷收到此錯誤,而且我不明白我的代碼有什么問題。 我正在使用C ++,並且正在使用QT框架。 我是這種語言和框架的新手。

錯誤:LNK2019:在function_main中引用的未解析的外部符號“ public:void __thiscall RAW :: foo(void)”(?foo @ Raw @@ QAEXXZ)。 找不到文件:main.obj

main.cpp

#include "raw.h"

using namespace std;


int main(int, char*)
{
    Raw newRaw;
    newRaw.foo();

    return 0;
}

raw.cpp

#include "raw.h"
#include <iostream>

using namespace std;

void foo()
{
    cout << "hi\n";
}

Raw::Raw()
{
    cout << "raw\n";
}

原始文件

#ifndef RAW_H
#define RAW_H

class Raw
{
public:
    Raw();
    void foo();
};

#endif // RAW_H

在raw.cpp中,您必須像這樣定義foo:

void Raw::foo()
{
    cout << "hi\n";
}

您必須放入Raw ::,以便編譯器知道這是類成員函數foo,而不是其他一些獨立函數。

就像Mihai所說的那樣,您也可以在Header文件(.h / .hpp)中定義它,但是如果您的類方法無論如何都是復雜的,則認為這是不好的做法。

class Raw {
public:
    void foo() {
        cout << "hi\n";
    }
};

只有真正真正應該這樣做的時候,才是極其簡單的類,而且這些方法實際上只是吸氣劑。

您應該了解在C ++中定義和聲明內容之間的區別。

聲明只是簡單地制作一個原型,例如void doSomething(int); 是有效的聲明,因為它說doSomething方法采用int並返回void。

現在,您需要描述它的作用。 這是您在void doSomething(int val) { cout << val << endl; } void doSomething(int val) { cout << val << endl; }因為你現在描述如何處理該功能。

您可以按照我在頭文件中的定義進行定義,也可以在Mihai所示的源文件(.c / .cpp)中進行定義(這是最佳做法)。 但是,您只能在Header文件中進行聲明。

好的,這是一些替代方法:

//raw.h

#ifndef RAW_H
#define RAW_H

class Raw
{
public:
    Raw();
    void foo(){cout << "raw\n";}
};

要么

//raw.h

#ifndef RAW_H
#define RAW_H

class Raw
{
public:
    Raw();
    void foo();
};

Raw::Raw()
{
    cout << "raw\n";
}

在這兩種情況下,您都不再需要raw.cpp中的實現。 但是正如我之前所說,我的第一個解決方案是標准的c ++實踐。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM