2015-04-12 3 views
0

Я начал создавать проект на своем компьютере. проект, составленный на моем компьютере, но когда я скопировал его на другой компьютер, у него были фатальные ошибки (его работа на Visual C++ Express 2010). его все еще мало, поэтому я просто скопирую весь проект.C++ error LNK2005 и ошибка LNK1169

источник файл->main.cpp:

#include <iostream> 
#include <string> 
using namespace std; 
#include "List.h" 
void products_menu(){ 
    return; 
} 
void stores_menu(){ 
    return; 
} 
void costumers_menu(){ 
    return; 
} 
int main(){ 
    int option; 
    Products a; 
    do{ 
     cin>>option; 
     if(option==1) 
      products_menu(); 
      //option funcion 
     if(option==2) 
      stores_menu(); 
      //option funcion 
     if(option==3) 
      costumers_menu(); 
      //option funcion 
    }while(option!=4); 
} 

источник файл->List.cpp:

#include <iostream> 
#include <string> 
using namespace std; 
#include "List.h" 
void products_menu(){ 
    return; 
} 
void stores_menu(){ 
    return; 
} 
void costumers_menu(){ 
    return; 
} 
int main(){ 
    int option; 
    Products a; 
    do{ 
     cin>>option; 
     if(option==1) 
      products_menu(); 
      //option funcion 
     if(option==2) 
      stores_menu(); 
      //option funcion 
     if(option==3) 
      costumers_menu(); 
      //option funcion 
    }while(option!=4); 
} 

Заголовок files->list.h:

#pragma once 
#ifndef LIST_H 
#define LIST_H 
#include <string> 
using namespace std; 

class Products{ 
    private: 
     typedef struct node{ 
      int id; 
      string name; 
      int price; 
      node* next; 
     }; 
     //typedef struct node* nodePtr; 
     //nodePtr head; 

    public: 
     Products(); 
     //~Products(); 
     void addProduct(int id, string& name, int price); 
     void updateNameProduct(int id, string& oldName, string& newName); 
     void updatePriceProduct(int id, int oldPrice, int newPrice); 
     void printProducts();// 
    }; 
Products* first; 
Products* nodePtr; 
#endif 

, и это ошибка, что дает мне:

ошибка LNK2005: "класс Продукты * nodePtr" (? NodePtr @@ 3PAVProducts @@ A) уже определен в List.obj
ошибка LNK2005: «класс Продукты * первой "уже определены в List.obj
ошибка LNK1169 (первый @@ 3PAVProducts @@ A?): один или несколько умножить определенные символы найдены

+0

Я узнал, что его работа, когда я беру Продукты * сначала; Продукты * nodePtr; линий. но почему он не работает с ними? –

+0

Объявите 'Продукты * сначала;' и 'Продукты * nodePtr;' как 'extern' в заголовке и один раз в' List.cpp'. –

+0

Просто о чем подумать: у вас есть функции дерева, которые ничего не возвращают, но каждый имеет оператор возврата в качестве своего единственного содержимого. Затем у вас есть функция, возвращающая целое число, но без оператора возврата. Затем просмотрите https://stackoverflow.com/questions/8646421/using-extern-keyword-to-declare-variables-in-header-files-c –

ответ

0

Если необходимо использовать глобальные переменные (которые, как правило, плохая идея), то вы не можете определить их в заголовке. Они подчиняются Правилу Единого определения, поэтому могут иметь только определение в одном исходном файле.

Объявить их в заголовке:

extern Products* first; 

и определить их в исходном файле:

Products* first; 

Но это звучит, как вы хотите что-то больше похоже на закомментированными деклараций: указатель на сначала node, как член класса Products, без каких-либо странных глобальных переменных.

Смежные вопросы