Top.Mail.Ru
Ответы
Аватар пользователя
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Разделение проекта на отдельные файлы (си и си++).

1) На первой картинке показан пример разделения проекта на два файла. Функция main остается в одном файле, функция F переезжает в другой файл. Проект в таком виде собирается и работает. Можно даже выкинуть из файла main.c протип функции F, gcc все равно найдет функцию F (правда, при создается объектного файла для main.o предупредит, что не найдено определение).
2) На второй картинке подбный проект, внутри которого реализована функция main и класс vec. Хотелось бы сделать то же самое: переместить весь класс vec в отдельный файл. Но при этом возникает проблема. Если вообще убрать класс из файла main.cpp, компилятор g++ не обойдется предупреждением, как в первом случае (как при компиляции без прототипа функции), он вообще откажется создавать объектный файл main.o. Если попробовать добавить прототип класса в файл main.cpp, тогда объектный файл соберется, но не соберется конечный проект, поскольку класс будет объявлен дважды (в прототипе в main.o и в vec.o).
Вопрос: как в данном случае сделать это разделение проекта на два файла?

По дате
По рейтингу
Аватар пользователя
Новичок

// Я сделал через три файла. Не знаю, как через два.
// main.cpp
#include <cstdio>
#include "vec.h"

int main()
{
vec A(1.0,3.4);
printf("A = {%f, %f}\n",A.X(),A.Y());
return 0;
}



// vec.cpp
#include "vec.h"

vec::vec(double X, double Y)
{
vec::x = X;
vec::y = Y;
}

double vec::X(void)
{
return vec::x;
}

double vec::Y(void)
{
return vec::y;
}



// vec.h
#ifndef VEC_H
#define VEC_H

class vec
{
private:
double x,y;
public:
vec(double X, double Y);
double X(void);
double Y(void);
};

#endif

/*
компилируется так:
g++ -c main.cpp
g++ -c vec.cpp
g++ -o pro main.o vec.o
*/

Аватар пользователя
Просветленный

"one definition rule" здесь не нарушается - все методы заинлайнены, поэтому указанных вами ошибок компоновки (линковки) быть не должно.
А класс можно хоть в 100500 транслейшн юнитах декларировать,

Покажите ошибки? Линкер ругается на методы vec::X() и vec::Y(), или еще на что-то?
И исходники лучше куда-нибудь выложить, откуда их можно скопипистить, например, на https://www.onlinegdb.com/online_c++_compiler

Вижу отсутствие точки с запятой после объяаления класса, но это другое.