Переопределения C++ - Заголовочные файлы

Я - полный новичок в 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++.

4 ответа

Решение

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

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; из вашего заголовочного файла. Даже в исходных файлах считается довольно плохой практикой загрязнять ваше глобальное пространство имен, но это становится заразительно, если вы делаете это в своем заголовочном файле.

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

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

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

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

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

Testapp() { };   

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

Testapp::Testapp(){
}

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

Testapp();   
Другие вопросы по тегам