链接错误:找到一个或多个多重定义的符号

Linking error: One or more multiply defined symbols found

本文关键字:错误 定义 符号 一个 链接      更新时间:2023-10-16

我试图编译我的程序,但我遇到了这些错误,我不知道在哪里可以找到并更正它。

1>Main.obj : error LNK2005: "int * Coins" (?Coins@@3PAHA) already defined in DisplayErrorMessage.obj
1>Main.obj : error LNK2005: "int * NumCoins" (?NumCoins@@3PAHA) already defined in DisplayErrorMessage.obj
1>Main.obj : error LNK2005: "int * ItemPrice" (?ItemPrice@@3PAHA) already defined in DisplayErrorMessage.obj
1>Main.obj : error LNK2005: "int * NumItems" (?NumItems@@3PAHA) already defined in DisplayErrorMessage.obj
1>MakeSelection.obj : error LNK2005: "int * Coins" (?Coins@@3PAHA) already defined in DisplayErrorMessage.obj
1>MakeSelection.obj : error LNK2005: "int * NumCoins" (?NumCoins@@3PAHA) already defined in DisplayErrorMessage.obj
1>MakeSelection.obj : error LNK2005: "int * ItemPrice" (?ItemPrice@@3PAHA) already defined in DisplayErrorMessage.obj
1>MakeSelection.obj : error LNK2005: "int * NumItems" (?NumItems@@3PAHA) already defined in DisplayErrorMessage.obj
1>ShowMenu.obj : error LNK2005: "int * Coins" (?Coins@@3PAHA) already defined in DisplayErrorMessage.obj
1>ShowMenu.obj : error LNK2005: "int * NumCoins" (?NumCoins@@3PAHA) already defined in DisplayErrorMessage.obj
1>ShowMenu.obj : error LNK2005: "int * ItemPrice" (?ItemPrice@@3PAHA) already defined in DisplayErrorMessage.obj
1>ShowMenu.obj : error LNK2005: "int * NumItems" (?NumItems@@3PAHA) already defined in DisplayErrorMessage.obj
1>c:userskanaandocumentsvisual studio 2010ProjectsAssign2DebugAssign2.exe : fatal error LNK1169: one or more multiply defined symbols found

这是完整的代码:

自动售货机.h

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int Denominations = 5;
int const ITEMS = 9;

class VendingMachine {
public:
    void MakeSelection(int NumItems [], int ItemPrice[]);
    int ReturnChange(int change, int Coins[], int NumCoins[]);
    void ShowMenu();
    void DisplayErrorMessage(int error);
    void PrintConfidentialInformation(int Denominations, int Items, int Coins[],
                                      int NumCoins[], int ItemPrice[] , int NumItems[]);
private:
    int selection;
    string code;
    double Each_Item[ITEMS];       //price for each item
};

MakeSelection.cpp

#include "VendingMachine.h"
void VendingMachine::MakeSelection(int NumItems [], int ItemPrice[]) {
    int Coins[] = {100, 50, 20, 10, 5};
    int NumCoins[] = {10, 10, 10, 10, 10}; //assume we have 10 coins of each denomination

    int ItemPrice[ ] = { 75, 120, 120, 100, 150, 95, 110, 50, 120 }; //price in cents
    int NumItems[ ] = { 10, 10, 10, 10, 10, 10, 10, 10, 10 };
    double Total_Price = 0;
    double Item_Total = 0;
    string Product[ITEMS] = {"Water","Coke","Diet Coke","Iced Tea","Swiss Chocolate","Candy",
                             "Chips","Bubble Gum","Turkish Delight"
                            };
    int b = 0;
    int a = 1;
    cout << "Please enter the number of your choice from the menu above. " << endl;
    do {
        cout << "nEnter the number of product OR End transaction: " << endl;
        cin >> selection;
        cout << "nYou have selected " <<Product[selection] << endl;
        if(selection >= 1 && selection <= 9) {
            NumItems[selection - 1] = NumItems[selection - 1] - 1;
            if(NumItems[selection - 1] >= 0)
                Total_Price = Total_Price + ItemPrice[selection - 1];
            else {
                int error = 1;
                DisplayErrorMessage(error);         //Item finised
                cout <<selection<< endl;
            }
        }
        else if(selection == 10)
            cout << "nTransaction Ended" << endl;
        else if(selection == 99) {
            cout << "Enter the code to access maintanance: " <<endl;
            cin >> code;
            while(code != "111") {
                int error = 2;
                DisplayErrorMessage(error);
                cin >> code;
            }
            cout << endl;
            cout << "tttttSales Report " << endl;
            cout << "==================================================== " << endl;
            cout << endl;
            cout << "Number of each product sold with Income cost: " << endl;
            cout << endl;
            do {
                if(NumItems[b] >= 0) {
                    Each_Item[b] = Each_Item[b] + ItemPrice[b];
                    cout << NumItems[b] << "" << Product[b] << " sold for the total cost of " <<(10 - NumItems [b]) * Each_Item[b]/ 100 <<endl;
                    Total_Price = Total_Price + ((10 - NumItems[b]) * Each_Item[b]/100);
                }
                b++;
            } while(a <= ITEMS);
        }
        else {
            int error = 3;
            DisplayErrorMessage(error);
        }
    } while(selection != 10);
}

您可以使用cpp文件和标题

头中的int * Coins;不是定义全局的方式。这是一个定义。你应该使用

extern int* Coins;

并在单个转换单元(cpp文件)中定义变量。

因为您在所有3个cpp文件中都包含了带有定义的标头,所以该符号会被定义多次,从而导致错误。

在头文件中使用包含保护:

#ifndef _VENDING_MACHINE_H_
#define _VENDING_MACHINE_H_
//your VendingMachine.h contents
#endif //_VENDING_MACHINE_H_