• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Проблема С Классом

  • Автор темы FeDoS
  • Дата начала
F

FeDoS

Здравствуйте!
Пытаюсь объявить класс в отдельном файле, но при компиляции получаю ошибку.
C++:
//main.cpp
#include "test.h"
#include <iostream>
int main()
{
Test_class test;
test.message();
test.message2();
test.message3();
system("pause");
}

C++:
//test.cpp
#include <iostream>
using namespace std;
#include "test.h"

void Test_class::message()
{
cout << "Message number 1" << endl;
}

void Test_class::message2()
{
cout << "Message number 2" << endl;
}

void Test_class::message3()
{
cout << "Message number 3" << endl;
}

C++:
//test.h
class Test_class
{
public:
void message();
void message2();
void message3();
};
Компилирую в dev c++
Ошибка:
multiple definition of `Test_class::message()'
А если сделать в таком варианте всё работает:
C++:
//main.cpp
#include "test.h"
#include <iostream>

int main()
{
Test_class test;
test.message();
test.message2();
test.message3();
system("pause");
}

C++:
//test.h
#include <iostream>
using namespace std;

class Test_class
{
public:
void message()
{
cout << "Message number 1" << endl;
}
void message2()
{
cout << "Message number 2" << endl;
}
void message3()
{
cout << "Message number 3" << endl;
}
};
 
W

Whatka

так во втрорм варианте у тебя класс и так в отдельном файле.
в VS эти 3 файла будут работать
 
F

FeDoS

Whatka, вы правы, в VS проект собирается.
Проблема решилась, но причина так и осталась для меня загадкой.
Я создал новый проект, но класс и методы писал не вручную, а добавил их на вкладке классы и получил код:
C++:
//main.cpp
#include <conio.h>
#include "test_class.h"
#include <iostream>

using namespace std;

int main()
{
Test_class test;
test.message();
test.message2();
test.message3();
system("pause");
}
C++:
//test_class.cpp
// Class automatically generated by Dev-C++ New Class wizard

#include "test_class.h" // class's header file
#include <iostream>

using namespace std;

// No description
void Test_class::message()
{
cout << "Message number 1" << endl;
}

// No description
void Test_class::message2()
{
cout << "Message number 2" << endl;
}

// No description
void Test_class::message3()
{
cout << "Message number 3" << endl;
}
C++:
//test_class.h
// Class automatically generated by Dev-C++ New Class wizard

#ifndef TEST_CLASS_H
#define TEST_CLASS_H

/*
* No description
*/
class Test_class
{
public:
// No description
void message3();
// No description
void message2();
// No description
void message();
};
#endif // TEST_CLASS_H
 
R

rrrFer

обрати внимание на:
Код:
#ifndef TEST_CLASS_H
#define TEST_CLASS_H

Добавлено: хотя, можно и не обращать внимание )
первый код тоже верный.
multiple definition вываливается если что-то несколько раз описывается, это может быть, например, если вы несколько раз включите один и тот же хедер в одну единицу трансляции (это случается чуть чаще чем постоянно в проектах чуть больше вашего), и директива #ifndef как в вашем случае или #pragma once (лучше используйте #ifndef ..) спасают от этого. Но у вас и в первом посте нет множественного включения хедера, там все верно, вроде бы.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!