Sederhananya:
Saya memiliki kelas yang sebagian besar terdiri dari anggota publik statis, jadi saya dapat mengelompokkan fungsi-fungsi serupa bersama-sama yang masih harus dipanggil dari kelas / fungsi lain.
Lagi pula, saya telah mendefinisikan dua variabel char unsigned statis dalam lingkup publik kelas saya, ketika saya mencoba untuk memodifikasi nilai-nilai ini di konstruktor kelas yang sama, saya mendapatkan kesalahan "simbol eksternal yang belum terselesaikan" pada kompilasi.
class test
{
public:
static unsigned char X;
static unsigned char Y;
...
test();
};
test::test()
{
X = 1;
Y = 2;
}
Saya baru mengenal C ++ jadi mudah saja. Mengapa saya tidak bisa melakukan ini?
Deklarasi anggota data statis dalam deklarasi kelas bukan definisi mereka. Untuk mendefinisikannya, Anda harus melakukan ini di
.CPP
file untuk menghindari simbol yang digandakan.Satu-satunya data yang dapat Anda deklarasikan dan tentukan adalah konstanta statis integral. (Nilai
enums
dapat digunakan sebagai nilai konstan juga)Anda mungkin ingin menulis ulang kode Anda sebagai:
Jika Anda ingin memiliki kemampuan untuk mengubah Anda variabel statis (dengan kata lain ketika tidak pantas untuk mendeklarasikan mereka sebagai const), Anda dapat memisahkan kode Anda antara
.H
dan.CPP
dengan cara berikut:.H:
.CPP:
sumber
Karena ini adalah utas SO pertama yang sepertinya muncul untuk saya ketika mencari "eksternal yang tidak terselesaikan dengan anggota const statis" secara umum, saya akan meninggalkan petunjuk lain untuk menyelesaikan satu masalah dengan eksternal yang belum terselesaikan di sini:
Bagi saya, hal yang saya lupa adalah menandai definisi kelas saya
__declspec(dllexport)
, dan ketika dipanggil dari kelas lain (di luar batas kelas dll), saya tentu saja mendapatkan kesalahan eksternal yang belum terselesaikan.Namun, mudah untuk dilupakan ketika Anda mengubah kelas pembantu internal menjadi kelas yang dapat diakses dari tempat lain, jadi jika Anda bekerja dalam proyek yang terhubung secara dinamis, Anda mungkin perlu memeriksanya juga.
sumber
dalam kasus saya, saya mendeklarasikan satu variabel statis dalam file .h, seperti
dan di myClass.cpp, saya mencoba menggunakan m_nMyVar ini. Itu mendapat kesalahan LINK seperti:
kesalahan LNK2001: simbol eksternal yang tidak terselesaikan "publik: kelas statis ... File cpp terkait kesalahan tautan terlihat seperti:
Jadi saya menambahkan kode di bawah ini di bagian atas myClass.cpp
maka LNK2001 hilang.
sumber
Dalam kasus saya, saya menggunakan tautan yang salah.
Itu dikelola c ++ (cli) tetapi dengan ekspor asli. Saya telah menambahkan ke linker -> input -> assembly link resource dll dari perpustakaan tempat fungsi diekspor. Tetapi penautan c ++ asli membutuhkan file .lib untuk "melihat" implementasi dalam cpp dengan benar, jadi bagi saya membantu menambahkan file .lib ke linker -> input -> dependensi tambahan.
[Biasanya kode yang dikelola tidak menggunakan ekspor dan impor dll, itu menggunakan referensi, tapi itu situasi yang unik.]
sumber