LNK2019 && LNK1120 Ошибки при разделении моего кода на несколько файлов - PullRequest
3 голосов
/ 11 октября 2009

Мой код хранится в файле main.cpp, который содержит функцию void main() и класс MyClass, который я сейчас хочу разделить на другой файл. IDE - это Microsoft Visual Studio 2008 Professional.

myclass.h

#include <tchar.h>
class MyClass {
public:
    static bool MyFunction (TCHAR* someStringArgument);
};

myclass.cpp

#include <tchar.h>
class MyClass {
private:
    static bool someProperty;
    static void doSomeOneTimeCode () {
        if (!someProperty) {
            /* do something */
            someProperty = true;
        }
    }
public:
    static bool MyFunction (TCHAR* someStringArgument) {
        doSomeOneTimeCode();
        /* do something */
        return true;
    }
};
bool MyClass::someProperty = false;

main.cpp

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include "myclass.h"
void main () {
    if (MyClass::MyFunction(TEXT("myString"))) {
        _tprintf(TEXT("Yay\n"));
    }
}

Однако, когда я пытаюсь запустить его, я получаю две ошибки компоновщика.

  • LNK2019: неразрешенный внешний символ ... (упоминается MyClass::MyFunction)
  • LNK1120: 1 неразрешенное внешнее

Что можно сделать, чтобы предотвратить эти ошибки компоновщика?

Ответы [ 3 ]

4 голосов
/ 11 октября 2009

Вы объявили два класса здесь. Один из них находится в myclass.h , а другой - в myclass.cpp . Вместо этого попробуйте следующее:

myclass.h

#ifndef myclass_h_included
#define myclass_h_included

#include <tchar.h>

class MyClass {
private:
    static bool someProperty;
    static void doSomeOneTimeCode ();
public:
    static bool MyFunction (TCHAR* someStringArgument);
};

#endif //!myclass_h_included

myclass.cpp

#include "myclass.h"

/*static*/ bool MyClass::someProperty = false;

void
MyClass::doSomeOneTimeCode() {
    //...
}
bool
MyClass::MyFunction(TCHAR* someStringArgument) {
    //...
}

Ваш main.cpp может остаться прежним. Я бы также обратил внимание на ответ UncleBens . Один раз код инициализации должен быть скрыт, если это вообще возможно.

3 голосов
/ 11 октября 2009

Йо не может разбить определение класса на части. Оно должно быть определено как единое целое. Если вы просто хотите, чтобы некоторые методы этого класса были определены, создайте интерфейсный класс, который позже будет наследовать класс MyClass. Вы должны поместить определение класса в файл заголовка (myclass.h), а его реализацию - в файл cpp (myclass.cpp). Таким образом, вы можете включить «myclass.h» в ваш основной cpp-файл и использовать класс в вашей основной функции (которая должна быть int main() или int main( int argc, char *argv[] )).

2 голосов
/ 11 октября 2009

Странно, что вы не получили ошибку компилятора, так как вы переопределяете MyClass.

Определения (реализации) идут в cpp, и они определяются следующим образом:

#include "myclass.h"
//helper functions, particularly if static, don't need to be in the class
//unnamed namespace means this stuff is available only for this source file
namespace 
{
    bool someProperty;
    void doSomeOneTimeCode () {
        if (!someProperty) {
            /* do something */
            someProperty = true;
        }
    }
}

bool MyClass::MyFunction (TCHAR* someStringArgument) {
    doSomeOneTimeCode();
    /* do something */
    return true;
}
...