include — C ++ Redefinitions — Заголовочные файлы

Я — полный новичок в C ++, и то, что вам может показаться глупо очевидным, я просто не могу понять.

Testapp.h

#ifndef TESTAPP_H
#define TESTAPP_H
using namespace std;
class Testapp {
private:
public:
Testapp() { };
};
#endif

main.cpp

#include <cstdlib>
#include <iostream>
#include "Testapp.h"Testapp::Testapp(){
}
int main(int argc, char *argv[])
{
system("PAUSE");
return EXIT_SUCCESS;
}

Сообщение об ошибке: Redefinition of 'Testapp::Testapp()'

По-видимому, он дважды определяет конструктор, как это преодолеть, хотя я не уверен. Я использую DEV-C ++.

1

Решение

Объявление функции также является определением, когда оно дает реализацию или тело функции. У вас есть определение конструктора в вашем определении класса, которое выглядит так:

Testapp() { };

Это тело { } и пусто. Тогда у вас есть другое определение в вашем main.cpp файл, который выглядит так:

Testapp::Testapp(){
}

Опять же, это определение функции имеет пустое тело. То, что реализации функций абсолютно одинаковы, не означает, что все в порядке. Согласно одному правилу определения, у вас не должно быть нескольких определений функции. Простое решение — сделать объявление в определении класса только объявлением, не указав тело:

Testapp();

Кроме того, вы можете просто избавиться от определения в main.cpp полностью. То, что вы в конечном итоге делаете, зависит от того, как вы хотите выложить свой код. Типичный подход состоит в том, чтобы иметь заголовочный файл, содержащий определение класса и объявления функций-членов, Testapp.h:

#ifndef TESTAPP_H
#define TESTAPP_H
using namespace std;
class Testapp {
private:
public:
Testapp(); // Just a declaration
};
#endif

Затем в файле реализации для этого класса, Testapp.cpp, дать определения функции-члена:

#include "Testapp.h"
Testapp::Testapp() { }

Затем в main.cppпросто включите заголовочный файл и используйте класс, который он определяет:

#include "Testapp.h"
int main(int argc, char *argv[])
{
Testapp test;
return 0;
}

Я рекомендую удалить using namespace std; из вашего заголовочного файла. Даже в исходных файлах считается очень плохой практикой загрязнять ваше глобальное пространство имен, но это становится положительно заразным, если вы делаете это в своем заголовочном файле.

4

Другие решения

В вашем заголовочном файле вы хотите написать только функцию «заглушка», или прототип функции:

class Testapp {
private:
public:
Testapp();
};

Вам нужно выучить разница между функциями декларации (прототипы) и функции определения в C ++.

2

Вы уже определили Testapp::Testapp в объявлении вашего класса

Testapp() { };

Вам нужно либо удалить

Testapp::Testapp(){
}

Или измените определение конструктора на объявление

Testapp();
1

Это действительно определено дважды — один раз в Testapp.h и один раз в main.cpp, просто удалите один из них.

1
По вопросам рекламы [email protected]