Ralat Berbilang Definisi dalam Fail Pengepala: Mengapa dan Cara Menyelesaikannya
Penyusun menghadapi ralat "takrifan berbilang" apabila ia dibentangkan dengan berbilang definisi simbol dalam program yang sama. Ini boleh berlaku apabila berbilang fail sumber termasuk fail pengepala yang sama, setiap satunya mentakrifkan simbol yang sama.
Mari kita periksa sampel kod yang disediakan:
// complex.h #include <iostream> class Complex { public: Complex(float Real, float Imaginary); float real() const { return m_Real; }; private: friend std::ostream& operator<< (std::ostream&, const Complex&); float m_Real; float m_Imaginary; }; std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Pengendali<< fungsi ditakrifkan dalam fail .h, menjadikannya calon untuk definisi berbilang kerana berbilang fail sumber akan memasukkannya.
// complex.cpp #include "complex.h" Complex::Complex(float Real, float Imaginary) { m_Real = Real; m_Imaginary = Imaginary; }
// main.cpp #include "complex.h" #include <iostream> int main() { Complex Foo(3.4, 4.5); std::cout << Foo << "\n"; return 0; }
Apabila menyusun kod ini, pengkompil menghadapi ralat "takrifan berbilang" untuk pengendali<< fungsi.
Mengapa Tidak untuk real()?
Fungsi ahli real() diselaraskan secara tersirat, bermakna pengkompil menganggapnya seolah-olah ia diisytiharkan sebaris walaupun ia tidak dinyatakan secara eksplisit dalam .h fail.
Resolusi
Untuk menyelesaikan isu takrifan berbilang bagi pengendali<< fungsi, terdapat dua alternatif utama:
Sebaris Fungsi:
Tambah kata kunci sebaris pada definisi fungsi untuk mengarahkan pengkompil untuk menyelaraskannya:
inline std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Alihkan Definisi ke Fail .cpp:
Alih keluar definisi fungsi daripada fail .h dan letakkannya dalam fail .cpp yang sepadan:
// complex.cpp std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
Penyelesaian Lain
Penyelesaian tambahan termasuk:
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat \'Multiple Definition\' dalam Fail Pengepala dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!