Невозможно вызвать другой класс - ERR - Неразрешенный внешний символ - PullRequest
1 голос
/ 16 февраля 2012

Я пытаюсь вызвать другую функцию, foo (), в классе Raw из main.cpp, но продолжаю получать эту ошибку, и я не понимаю, что не так с моим кодом.Я работаю в C ++, и я использую инфраструктуру QT.Я новичок в этом языке и фреймворке.

Ошибка: LNK2019: неразрешенный внешний символ "public: void __thiscall RAW :: foo (void)" (? Foo @ Raw @@ QAEXXZ), на который есть ссылка в function_main.Файл не найден: 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";
}

raw.h

#ifndef RAW_H
#define RAW_H

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

#endif // RAW_H

Ответы [ 3 ]

4 голосов
/ 16 февраля 2012

В raw.cpp вы должны определить foo следующим образом:

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

Вы должны установить Raw ::, чтобы компилятор знал, что это функция-член класса foo, а не какая-то другая независимая функция.

3 голосов
/ 16 февраля 2012

Как говорил Михай, вы также можете определить его в файле заголовка (.h / .hpp), но это считается плохой практикой, если ваш метод класса каким-либо образом сложен.

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

Только раз вы действительно должны это делать для очень простых классов и для методов, которые на самом деле являются не более чем геттерами.

Вы должны понимать разницу между определением и объявлением чего-либо в C ++.

Объявлениеэто просто сделать прототип, например, void doSomething(int); является допустимым объявлением, так как он говорит, что метод doSomething принимает int и возвращает void.

Теперь вам нужно описать, что он делает.Это определение, когда вы делаете void doSomething(int val) { cout << val << endl; }, как вы сейчас описываете, что делать с этой функцией.

Вы можете сделать определение в заголовочном файле, как я показал, или в исходном файле (.c/.cpp), как показал Михай (что является лучшей практикой).Вы можете делать свои объявления только в заголовочном файле.

2 голосов
/ 16 февраля 2012

Хорошо, это несколько альтернатив:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...