我有一个代码。类、实现和主要功能。当一切都在一个 cpp 文件中时,一切正常。试图将类实现与接口分开 - 出现 2 个错误。可能是什么问题呢?
机器.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
机器.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;
}
源.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.txt\n";
char ch;
while (fin.get(ch))
cout << ch;
cout << "\n\nВывод закончен\n\n";
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 << "\n\nНазвание станка, который имеет наименьшее количество отработанных часов -->> ";
ma -> TASK2(ma, 2);
return 0;
}
错误:
1)
Ошибка LNK2005 "float kool" (?kool@@3MA) уже определен в machine.obj
2)
Oшибка LNK1169 обнаружен многократно определенный символ - один или более ПР 6
float kool = 0;
整个程序中只能有一个。它应该只保留在一个 .cpp 文件中(意思是 - inmachine.cpp
)。为了能够从其他文件中使用它,您需要使用
extern float kool;
. 为了不在每个文件中都写这个,最好把它放在标题(machine.h
)中。或者,如果你有一个相当新的编译器,你可以
machine.h
在头文件 ( ) 中写入inline float kool = 0;
(并float kool = 0;
从所有文件中删除),而不是所有这些。