Я — полный новичок в 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 ++.
Объявление функции также является определением, когда оно дает реализацию или тело функции. У вас есть определение конструктора в вашем определении класса, которое выглядит так:
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::Testapp
в объявлении вашего класса
Testapp() { };
Вам нужно либо удалить
Testapp::Testapp(){
}
Или измените определение конструктора на объявление
Testapp();
Это действительно определено дважды — один раз в Testapp.h и один раз в main.cpp, просто удалите один из них.