我有一個基類和一個派生類(派生自基類)。這兩個類都有一個名為“getNumber()”的方法。
在我的 main() 中,我想運行 Derived 類的方法“getNumber()”。我的 main 實體化了 Animal 類的一個物件。在 Animal 類中是成員變數:指向 Base 類的指標,稱為“base”。但是,在 Animal 類的建構式中,我想將該“基”指標設定為 Derived 型別的物件。
但是,當我嘗試編譯它時,我收到以下錯誤訊息:
Animal.cc:(.text 0x0): multiple definition of `Derived::getNumber()'; /tmp/ccwfn1zo.o:Derived.cc:(.text 0x0): first defined here
/usr/bin/ld: /tmp/ccwfn1zo.o: in function `Derived::~Derived()':
Derived.cc:(.text._ZN7DerivedD2Ev[_ZN7DerivedD5Ev] 0x26): undefined reference to `Base::~Base()'
/usr/bin/ld: /tmp/ccwfn1zo.o:(.data.rel.ro._ZTI7Derived[_ZTI7Derived] 0x10): undefined reference to `typeinfo for Base'
/usr/bin/ld: /tmp/ccpsXsim.o: in function `Derived::Derived()':
Animal.cc:(.text._ZN7DerivedC2Ev[_ZN7DerivedC5Ev] 0x18): undefined reference to `Base::Base()'
collect2: error: ld returned 1 exit status
這是主要的:
#include <iostream>
#include "Animal.h"
#include "Base.h"
using namespace std;
int main()
{
Animal * a = new Animal;
cout << a->base->getNumber();
}
下面是 Base.h 中 Base 類的代碼:
class Base {
public:
Base ();
virtual ~Base ();
public:
virtual unsigned int getNumber() {
return 1;
}
};
這是 Derived.cc 的代碼:
#include "Base.h"
class Derived : public Base {
public:
~Derived () {}
public:
unsigned int getNumber () override;
};
unsigned int Derived::getNumber () {
return 5;
}
這是 Animal.h 的代碼
class Base;
class Animal {
public:
Animal ();
~Animal ();
public:
Base* base = nullptr;
};
最后是 Animal.cc
#include "Animal.h"
#include "Derived.cc"
Animal::Animal () {
base = new Derived;
}
我究竟做錯了什么 ?我認為它是基本的東西,但我沒有看到它。
uj5u.com熱心網友回復:
問題是您包含一個名為而不是頭檔案的源檔案。Derived.cc這會導致多重定義錯誤,因為該源檔案隨后被包含(直接和間接)到其他檔案中,因此上述成員函式存在“多重定義” Derived::getNumber()。
為了解決這個問題,您應該創建一個名為的頭檔案Derived.h,其中包含成員函式的宣告和一個單獨的源檔案,其中包含這些成員函式的實作,如下所示。作業演示
主檔案
#include <iostream>
#include "Animal.h"
#include "Base.h"
int main()
{
Animal * a = new Animal;
std::cout << a->base->getNumber();
}
基數.h
#include <iostream>
#include "Animal.h"
#include "Base.h"
int main()
{
Animal * a = new Animal;
std::cout << a->base->getNumber();
}
Base.cc
#include "Base.h"
Base::Base()
{
}
Base::~Base()
{
}
動物.h
class Base;
class Animal {
public:
Animal ();
~Animal ();
public:
Base* base = nullptr;
};
動物.cc
#include "Animal.h"
#include "Derived.h"
Animal::Animal () {
base = new Derived;
}
派生的.h
#include "Base.h"
class Derived : public Base {
public:
~Derived () {}
public:
unsigned int getNumber () override;
};
衍生.cc
#include "Derived.h"
unsigned int Derived::getNumber () {
return 5;
}
作業演示
注意:我們不應該包含源檔案。
uj5u.com熱心網友回復:
包括源檔案,如
#include "Derived.cc"
是一種不好的做法。相反,將應該從多個源檔案中看到的所有內容放在頭檔案中并包含頭檔案。
在這種情況下,您應該創建一個新的頭檔案Derived.h并將類的宣告移動Derived到頭檔案中。函式的定義Derived::getNumber應保留在Derived.cc.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/454381.html
