C ++ не может использовать класс из другого файла - PullRequest
0 голосов
/ 06 июня 2018

Я C ++, пишу небольшие программы.Я тоже хочу работать с несколькими файлами.Я застрял на использовании класса из другого файла.Я сделал простой тестовый проект, чтобы продемонстрировать свою проблему.У меня есть 3 файла.

testheader.h

#ifndef __testheader_H_INCLUDED__   // if Node.h hasn't been included yet...
#define __testheader_H_INCLUDED__   //   #define this so the compiler knows it has been included

#include <string>
#include <iostream>
class testheader { 
    public:
    testheader(std::string name){}
    void write(){}
};
#endif

testheader.cpp

#include <string>
#include <iostream>

using namespace std;

class testheader {
    public:
    testheader(string name){
        cout << name << endl;
    }
    void write(){
        cout << "stuff" << endl;
    }
};

anotherfile.cpp

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

using namespace std;

int main () {
    cout << "testing" << endl;
    testheader test("mine");
    test.write();
    return 0;
}

Я их компилируювсе в Linux, используя g ++ с командой

g++ -std=c++11 testheader.cpp anotherfile.cpp testheader.h -o another

Когда я запускаю «другой» исполняемый файл, вывод

test

, что я ожидаю, это выход

тестирование моих вещей

Кажется, мой объект класса "test" компилируется как null.Я не уверен, что это мой заголовок или файлы не связаны должным образом.Когда объект testheader создается в main, он явно не вызывает конструктор в testheader.cpp, как ожидалось.Вы можете помочь новичку?

Спасибо, Нуб

1 Ответ

0 голосов
/ 06 июня 2018

Главное событие

В testheader.h

testheader(std::string name){}

объявляет и реализует функцию, которая ничего не делает, вместо ее определения и реализации в другом месте.Это то, что называется, а не печать.Вы хотите

testheader(std::string name);

Теперь main может видеть, что функция существует, и компоновщик будет искать ее (и как только исправятся два и три, найдите ее в testheader.cpp.

Далее

g++ -std=c++11 testheader.cpp anotherfile.cpp testheader.h -o another

не компилировать файлы заголовков. Копия файла заголовка включена во все файлы, которые #include it. Компилировать только файлы реализации, поэтому

g++ -std=c++11 testheader.cpp anotherfile.cpp -o another

Шаг третий: Прибыль!

testheader определен в testheader.h. В testheader.cpp должны быть только реализации функций и хранилища для статических элементов.

Пример testheader.cpp:

#include <string>
#include <iostream>
#include "testheader.h" // so it knows what testheader looks like

using namespace std;

testheader::testheader(string name)
{
    cout << name << endl;
}
void testheader::write()
{
    cout << "stuff" << endl;
}

Примечание: __testheader_H_INCLUDED__ является недопустимым идентификатором. Среди других правил о том, как / где использовать подчеркивания ( Каковы правила использования подчеркивания в идентификаторе C ++?) никогда не ставьте два подчеркивания подряд в любом месте вашего кода.

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