2011-12-12 37 views
7

Tôi có lớp này với các tham số cấu hình biến. Tôi muốn đưa nó vào các lớp khác: JugadorHumano, JugadorIA, Main, PartidaClasica, PartidaMision.Lỗi liên kết khi khai báo các biến tĩnh công cộng trong C++

#pragma once 

class Configuracion 
{ 
public: 
    static int MAX_ATAQUES; 
    static int DIV_TERRITORIOS; 
}; 

int Configuracion::MAX_ATAQUES = 5; 
int Configuracion::DIV_TERRITORIOS = 3; 

Điều tôi muốn là có thể sửa đổi hoặc đọc các giá trị từ các lớp khác. Tôi không thể khai báo một biến tĩnh và định nghĩa nó trong khai báo. Tôi không thể để các biến đó không có định nghĩa vì tôi gặp lỗi "Chưa được giải quyết bên ngoài".

1>JugadorIA.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>JugadorIA.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>Main.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>Main.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaClasica.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaClasica.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaMision.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaMision.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>D:\Leire\My Dropbox\Carpetas compartidas\Compartidos Victor\Practicas POO II\P3\P3M10\Debug\P3M10.exe : fatal error LNK1169: one or more multiply defined symbols found 

Tôi nên làm gì để tránh định nghĩa lại tôi nhận được? Tôi không thể hình dung ra và tôi không thể tìm thấy một vấn đề tương tự.

Trả lời

12

Bạn nên viết định nghĩa trong tệp cpp, nếu không, khi bạn đưa tệp tiêu đề của mình vào nhiều tệp C++ (đơn vị dịch), bạn sẽ nhận được lỗi định nghĩa lại. Và #pragma chỉ hoạt động trong một đơn vị dịch. Vì vậy, bạn cần tệp Configuration.cpp với các nội dung sau đây

#include "Configuracion.h" 

int Configuracion::MAX_ATAQUES = 5; 
int Configuracion::DIV_TERRITORIOS = 3; 

Ngoài ra, nếu lớp của bạn chỉ chứa thành viên tĩnh, bạn có tùy chọn xem xét có không gian tên thay vì một lớp.

+1

Nếu bạn không muốn sửa đổi chúng, bạn có thể làm cho chúng const. Tất cả các tên viết hoa thường chỉ ra const. –

+0

Cảm ơn bạn rất nhiều vì câu trả lời nhanh, đã giải quyết được! – Zhertal

+0

@armen: Bạn đã cứu ngày của tôi. Bây giờ tôi cần quay lại và đọc về đơn vị dịch thuật. –

3

Đặt định nghĩa biến trong tệp nguồn và biên dịch và liên kết riêng biệt.

Tiêu đề chỉ nên chứa các khai báo và hàm nội dòng.

#pragma once bảo vệ một đơn TU (đơn vị dịch); nó không cung cấp sự bảo vệ chống lại nhiều TU độc lập bao gồm (và do đó xác định) cùng một biến.

Các vấn đề liên quan