2013-03-12 50 views
6

Hi mới bắt đầu iam tại C++ i có lớp học với phương pháp tĩnh và tôi không thể truy cập vào chúng nó ném cho tôi một lỗiC++ biểu tượng bên ngoài chưa được giải quyết

1>------ Build started: Project: CPractice, Configuration: Debug Win32 ------ 
1> Source.cpp 
1>Source.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > CPractice::name" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@A) 
1>c:\users\innersoft\documents\visual studio 2012\Projects\CPractice\Debug\CPractice.exe : fatal error LNK1120: 1 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

và đây là mã của tôi

#include <iostream> 
#include <stdio.h> 
#include <cstdlib> 
#include <string> 

using namespace std; 

class CPractice 
{ 
    public: 
     static void setName(string s) 
     { 
      name = s; 
     } 
     static string getName() 
     { 
      return name; 
     } 
    private: 
     static string name; 
}; 


int main() 
{ 


    CPractice::setName("Name"); 
    cout << "\n" << CPractice::getName(); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

Trả lời

18
static string name; 

Vì nó là static, dòng này chỉ tuyên bốname - bạn cũng cần phải xác định nó. Đơn giản chỉ cần đặt này dưới đây định nghĩa lớp học của bạn:

string CPractice::name; 

Nếu bạn kết thúc di chuyển lớp học của bạn đến một tiêu đề và thực hiện tập tin tương ứng, hãy chắc chắn bạn đặt định nghĩa này trong file thực thi. Nó chỉ nên được xác định trong một đơn vị dịch duy nhất.

+0

tôi nghĩ rằng định nghĩa của nó allready khi tôi tuyên bố nó. Tác phẩm của nó, cảm ơn rất nhiều –

+1

@SilvioMarijic Đó là một sai lầm phổ biến mà mọi người gặp phải. Lý do nó không phải là một định nghĩa là tránh có nhiều định nghĩa. Nếu đó là một định nghĩa và bạn đã bao gồm tiêu đề nó đã được đưa vào nhiều tệp khác, bạn sẽ có nhiều định nghĩa của cùng một thành viên tĩnh. Dù sao, đừng quên nói lời cảm ơn bằng cách chấp nhận câu trả lời đã giúp bạn nhiều nhất. –

1

Tôi nghĩ bạn đang cố gắng biên dịch với gcc, khi bạn cần biên dịch với g++. Xem What is the difference between g++ and gcc? để biết thêm về điều này.

Bạn cũng cần thêm string CPractice::name; bên dưới định nghĩa lớp học của mình.

1

Bạn chỉ tuyên bố name trong lớp, các biến tĩnh cần phải được xác định như vậy bên ngoài của lớp:

string CPractice::name ="hello" ; 
1

Từ tên là một tĩnh thành viên dữ liệu bạn nên khởi tạo nó :) và không đếm trên hàm tạo liên quan đến cá thể mặc định.

Thêm này sau khi định nghĩa lớp (vâng, tôi biết khó hiểu của nó kể từ khi thành viên của bạn là một cá nhân, nhưng đây chỉ là một khởi):

string CPractice::name; 
Các vấn đề liên quan