ОБСУЖДЕНИЕ

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

3 ответов 3,3 тыс.
Автор темы
Здравствуйте!
Пытаюсь объявить класс в отдельном файле, но при компиляции получаю ошибку.
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;
}
};
 
так во втрорм варианте у тебя класс и так в отдельном файле.
в VS эти 3 файла будут работать
 
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
 
обрати внимание на:
Код:
#ifndef TEST_CLASS_H
#define TEST_CLASS_H

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