Имею код. Класс, реализация и главная функция. Когда всё находится в одном файле cpp — всё работает. Попытался отделить реализацию класса от интерфейса — получил 2 ошибки.
В чем может быть проблема?
machine.h:
#pragma once
#ifndef MACHINE_H
#define MACHINE_H
class Machine {
public:
char name[50]; // название станка
float kol; // количество отработанных часов
float kolH; // количество изготовленных деталей за час
void TEST(void);
void TASK2(const Machine* arr, size_t n);
void INIT(void);
void SHOW(void);
Machine();
Machine(const char* na, float ko, float koH);
Machine(const Machine& obj);
~Machine();
};
#endif
machine.cpp:
#include <iostream>
#include <string>
#include <fstream>
#include "machine.h"
using namespace std;
float kool = 0;
Machine::Machine() {
cout << endl << "--------------------------------------------------" << endl;
cout << "Этот обьект был создан в конструкторе по умолчанию.n";
strcpy(name, "СтанокВторой");
kol = 3;
kolH = 8;
}
Machine::Machine(const char* na, float ko, float koH) {
cout << endl << "--------------------------------------------------" << endl;
cout << "Этот обьект был создан в конструкторе с параметрами.n";
strcpy(name, na);
kol = ko;
kolH = koH;
}
Machine::Machine(const Machine& obj) {
cout << endl << "--------------------------------------------------" << endl;
cout << "Этот обьект был создан в конструкторе копирования.n";
strcpy(name, obj.name);
kol = obj.kol;
kolH = obj.kolH;
}
void Machine::TEST(void) {
kool += kol;
}
Machine::~Machine() {
cout << endl << "--------------------------------------------------" << endl;
cout << "Удаление объекта деструктором.n";
}
void Machine::SHOW(void) {
cout << endl << "--------------------------------------------------" << endl;
cout << "Информация о станке:n";
cout << "nНазвание станка > " << name;
cout << "nКоличество отработанных часов > " << kol;
cout << "nКоличество изготовленных деталей за час > " << kolH;
}
void Machine::INIT(void) {
cout << endl << "--------------------------------------------------" << endl;
cout << "Введите данные о станке:n";
cout << "nНазвание > "; cin >> name;
cout << "nКоличество отработанных часов > "; cin >> kol;
cout << "nКоличество изготовленных деталей за час > "; cin >> kolH;
}
void Machine::TASK2(const Machine* arr, size_t n) {
size_t i_min = 0;
for (size_t i = 1; i < n; ++i)
if (arr[i_min].kol > arr[i].kol)
i_min = i;
std::cout << arr[i_min].name << std::endl;
}
Source.cpp:
#include <iostream>
#include <string>
#include <fstream>
#include "machine.h"
using namespace std;
float kool = 0;
int main() {
setlocale(0, "");
Machine M1("Станок_Большой", 32, 68);
M1.SHOW();
Machine M2;
ofstream fout;
fout.open("1.txt");
fout << M1.name << " " << M1.kol << " " << M1.kolH;
fout.close();
ifstream fin;
fin.open("1.txt");
fin >> M2.name >> M2.kol >> M2.kolH;
fin.close();
cout << "nИнформация про станок 2:n";
M2.SHOW();
fin.open("1.txt");
fin.seekg(0);
cout << "nПотоковый вывод содержания 1.txtn";
char ch;
while (fin.get(ch))
cout << ch;
cout << "nnВывод законченnn";
fin.close();
M1.TEST();
M2.TEST();
cout << "Количество отработаных часов (общее): " << kool;
cout << endl << "--------------------------------------------------" << endl;
cout << "Заполнение массива экземпляров ma";
Machine ma[2];
for (int i = 0; i < 2; i++) {
cout << "nВвод информации про " << i + 1 << " объект";
ma[i].INIT();
}
for (int i = 0; i < 2; i++) {
cout << "nВывод информации про " << i + 1 << " объект";
ma[i].SHOW();
}
cout << "nnНазвание станка, который имеет наименьшее количество отработанных часов -->> ";
ma -> TASK2(ma, 2);
return 0;
}
Ошибки:
1)
Ошибка LNK2005 "float kool" (?kool@@3MA) уже определен в machine.obj
2)
Oшибка LNK1169 обнаружен многократно определенный символ - один или более ПР 6
unreal 0 / 0 / 1 Регистрация: 26.02.2012 Сообщений: 118 |
||||
1 |
||||
06.03.2012, 18:36. Показов 59867. Ответов 9 Метки нет (Все метки)
код который показан снизу я компилировал в двух программах на visual c++ и dev c++
0 |
5827 / 3478 / 358 Регистрация: 08.02.2010 Сообщений: 7,448 |
|
06.03.2012, 18:45 |
2 |
unreal, скорее всего, у тебя в проекте есть еще файл, в котором определена функция main. Выложи сообщение об ошибке полностью
1 |
unreal 0 / 0 / 1 Регистрация: 26.02.2012 Сообщений: 118 |
||||
06.03.2012, 20:33 [ТС] |
3 |
|||
даже так
пишеть ошибку. что делать прошу помогите
0 |
5230 / 3202 / 362 Регистрация: 12.12.2009 Сообщений: 8,112 Записей в блоге: 2 |
|
06.03.2012, 20:50 |
4 |
unreal, ты проект ни того типа создал. Создай консольное приложение.
1 |
0 / 0 / 1 Регистрация: 26.02.2012 Сообщений: 118 |
|
06.03.2012, 20:52 [ТС] |
5 |
спс. а какое их отличие ?
0 |
5230 / 3202 / 362 Регистрация: 12.12.2009 Сообщений: 8,112 Записей в блоге: 2 |
|
06.03.2012, 20:54 |
6 |
Разные ключи компиляции для консольного и неконсольного приложения.
1 |
0 / 0 / 1 Регистрация: 26.02.2012 Сообщений: 118 |
|
06.03.2012, 21:04 [ТС] |
7 |
почему в visual c++ не откроет <iostream.h> ?
0 |
5230 / 3202 / 362 Регистрация: 12.12.2009 Сообщений: 8,112 Записей в блоге: 2 |
|
07.03.2012, 08:09 |
8 |
почему в visual c++ не откроет <iostream.h> ? Потому что это старый стандарт, сейчас пишут просто <iostream>
1 |
Заблокирован |
|
07.03.2012, 16:35 |
9 |
int& d = c;
_WinMain@16 в функции ___tmainCRTStartup — это означает что по всей видимости ты выбрал тим проекта Win32 вместо Console aplication. Просто создай по новой проект и выбери правильный тип проекта
1 |
1 / 1 / 0 Регистрация: 05.11.2012 Сообщений: 8 |
|
07.11.2012, 20:13 |
10 |
unreal, скорее всего, у тебя в проекте есть еще файл, в котором определена функция main. Выложи сообщение об ошибке полностью У меня вообще не выдает ошибку только, если 1 файл в проекте.
0 |
I am getting this error:
fatal error LNK1169: one or more multiply defined symbols found
Below are two files containing the code. In file 1, I have the main()
function and I am calling the functions which are written in the second file named linklist.cpp
.
Thanks for helping in advance.
File 1 — main.cpp
#include "stdafx.h"
# include "linklist.cpp"
int main(int argc, _TCHAR* argv[])
{
node *link_list2;
link_list2 = createList(31);
addFront(link_list2,33);
printList(link_list2);
printf("Hello There Omer Obaid khann");
return 0;
}
File 2 — linklist.cpp
# include "stdafx.h"
# include <stdlib.h>
struct node{
node * next;
int nodeValue;
};
node* initNode(int number);
node* createList (int value);
void addFront (node *head, int num );
void deleteFront(node*num);
void destroyList(node *list);
int getValue(node *list);
node*createList (int value) /*Creates a Linked-List*/
{
node *dummy_node = (node*) malloc(sizeof (node));
dummy_node->next=NULL;
dummy_node->nodeValue = value;
return dummy_node;
}
void addFront (node *head, int num ) /*Adds node to the front of Linked-List*/
{
node*newNode = initNode(num);
newNode->next = NULL;
head->next=newNode;
newNode->nodeValue=num;
}
void deleteFront(node*num) /*Deletes the value of the node from the front*/
{
node*temp1=num->next;
if (temp1== NULL)
{
printf("List is EMPTY!!!!");
}
else
{
num->next=temp1->next;
free(temp1);
}
}
void destroyList(node *list) /*Frees the linked list*/
{
node*temp;
while (list->next!= NULL)
{
temp=list;
list=temp->next;
free(temp);
}
free(list);
}
int getValue(node *list) /*Returns the value of the list*/
{
return((list->next)->nodeValue);
}
void printList(node *list) /*Prints the Linked-List*/
{
node*currentPosition;
for (currentPosition=list->next; currentPosition->next!=NULL; currentPosition=currentPosition->next)
{
printf("%d n",currentPosition->nodeValue);
}
printf("%d n",currentPosition->nodeValue);
}
node*initNode(int number) /*Creates a node*/
{
node*newNode=(node*) malloc(sizeof (node));
newNode->nodeValue=number;
newNode->next=NULL;
return(newNode);
}
Coding Mash
3,3405 gold badges23 silver badges45 bronze badges
asked Oct 4, 2012 at 9:00
I stopped reading after # include "linklist.cpp"
. Don’t include implementation files in other implementation files. (unless you’re doing bulk-builds, which I doubt). Separate declarations in headers and include those, and keep the definitions in the implementation files.
answered Oct 4, 2012 at 9:01
Luchian GrigoreLuchian Grigore
253k64 gold badges457 silver badges621 bronze badges
7
You have two ways to solve your problem:
First is given in answer of Luchian Grigore. Create separate header and include it in main file.
Second one is exclude file linklist.cpp from build using project options.
In other way this file will be build twice: during his own build and during main file build.
However, second way is not good programming style. It is better to create header file.
answered Oct 4, 2012 at 9:13
Danil AsotskyDanil Asotsky
1,2414 gold badges23 silver badges29 bronze badges
Permalink
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
-
Go to file
-
Copy path
-
Copy permalink
Cannot retrieve contributors at this time
description | title | ms.date | f1_keywords | helpviewer_keywords | ms.assetid |
---|---|---|---|---|---|
Learn more about: Linker Tools Error LNK1169 |
Linker Tools Error LNK1169 |
11/04/2016 |
LNK1169 |
LNK1169 |
e079d518-f184-48cd-8b38-969bf137af54 |
Linker Tools Error LNK1169
one or more multiply defined symbols found
The build failed due to multiple definitions of one or more symbols. This error is preceded by error LNK2005.
The /FORCE or /FORCE:MULTIPLE option overrides this error.
- Remove From My Forums
Объясните пожалуйста что не так
-
Вопрос
-
Язык программирования: C
Среда разработки: Visual Studio 2012 Express
Не могу понять следующее: я хочу связать между собой main.c и
count.c(как они выглядят можно найти ниже).В count.c определена переменная num, которая равна
10. В main.c я хочу вывести переменную
num на экран.Если определить num как static int num = 10, то всё работает, однако как только я уберу
static выходят следующие ошибки:Ошибка
1 error LNK2005: _b уже определен в count.obj
c:UsersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29test_29main.obj
test_29Ошибка
2 error LNK1169: обнаружен многократно определенный символ — один или более
c:usersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29Debugtest_29.exe
test_29Пожалуйста, объясните в чём ошибка. И да, разве static не должен скрывать переменную от других файлов?
Код, в котором возникает ошибка:
main.c:
#include <stdio.h> #include "count.c" main(void) { printf("%dn", num); }
count.c:
int num = 10;
Ответы
-
#include — это простая текстовая подстановка. То есть у Вас получается:
main.c:#include <stdio.h> int num = 10; main(void) { printf("%dn", num); }
count.c:
int num = 10;
То есть, оба модуля определяют внешнюю переменную с одним и тем же именем, что и приводит к ошибке.
При использовании static, оба модуля объявляют свою собственную переменную num, недоступную другому модулю.-
Помечено в качестве ответа
11 января 2014 г. 18:37
-
Снята пометка об ответе
iTiPo
11 января 2014 г. 19:12 -
Помечено в качестве ответа
Taras KovalenkoBanned
12 января 2014 г. 13:45
-
Помечено в качестве ответа
-
> А разве если мы подставили текст из count.c он не должен далее игнорироваться(файл)?
Если не ошибаюсь, компилятор пройдётся по всем файлам и скомпилирует весь код, независимо от того, был ли он вставлен уже куда-то.
Чтобы избежать повторных вставок-комплиляций, используются
Include guard.-
Помечено в качестве ответа
Taras KovalenkoBanned
12 января 2014 г. 13:45
-
Помечено в качестве ответа
-
Объект из другого модуля можно использовать, если повторить его объявление с модификатором extern. Вот так может выглядеть модуль main.c:
#include <stdio.h> extern int num; // инициализация не учитывается void main() { ... }
Включать директивой include файлы исходного кода нельзя, т.к. это приведет к многократной компиляции их кода.
-
Изменено
kosuke904
13 января 2014 г. 5:18 -
Помечено в качестве ответа
iTiPo
13 января 2014 г. 7:55
-
Изменено