2012-10-10 15 views
0

我有一些代碼編譯但不會鏈接。我不確定這是爲什麼 - 我知道這個問題通常是通過修復鏈接在一起的問題來解決的,但我不知道爲什麼這會突破。 TransGame是一個擴展Game的類,SearchGame是一個擴展TransGame的類。鏈接器錯誤類使用它擴展的類中的方法

這裏是我得到的錯誤:

[email protected]:~/ConnectFour$ make all                                            
g++ -c -o SearchGame.o SearchGame.cc 
g++ -c -o TransGame.o TransGame.cc 
g++ -c -o Game.o Game.cc 
g++ SearchGame.o TransGame.o Game.o -o SearchGame 
TransGame.o: In function `TransGame::hash()': 
TransGame.cc:(.text+0x5f): undefined reference to `Game::positioncode()' 
collect2: ld returned 1 exit status 
make: *** [SearchGame] Error 1 

這裏是我的makefile:

CFLAGS = -c -Wall 
SOURCES = SearchGame.cc TransGame.cc Game.cc 
OBJECTS = $(SOURCES:.cc=.o) 
EXECUTABLE = SearchGame 
.PHONY : all clean 

all : $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CXX) $(OBJECTS) -o [email protected] 

*.o : 
    $(CXX) $(CFLAGS) $< -o [email protected] 

clean: 
    rm -rf *.o 

這裏是代碼的相關位:

TransGame.cc

#include "Game.h" 
#include "TransGame.h" 
// snip 
void TransGame::hash() { 
    long htemp = positioncode(); 
    //snip 
} 

TransGame.h

#ifndef TRANSGAME_H 
#define TRANSGAME_H 
//snip 
class TransGame : public Game { 
    public: 
    //snip 
    void hash(); 
    //snip 
}; 

#endif 

Game.cc

#include "Game.h" 
// snip 
inline long Game::positioncode() { 
    return color[nplies & 1] + color[0] + color[1] + BOTTOM; 
} 

Game.h

#ifndef GAME_H 
#define GAME_H 
//snip 
class Game { 
    public: 
    //snip 
    long positioncode(); 
    //snip 
}; 

#endif 

任何幫助將不勝感激 - 我相信我的思念在我的makefile一些明顯。

+1

失去了內聯或將其與類定義移到頭文件。 – WhozCraig

+1

您不能內聯.cc文件中的方法 - 它們必須放置在頭文件中。原因是編譯器需要查看內聯它的方法,但在使用時,他只知道頭文件 - 而不是cc文件。可能有編譯器有某種字典 - 但我懷疑它。 –

回答

1

你的函數Game::positioncode()是一個內聯函數,需要在頭文件中,因爲編譯器需要知道它的定義,用代碼替換對positioncode的調用。

有兩種方式:您可以添加class Game定義下面的功能,也可以直接將它添加到聲明:

class Game { 
    public: 
    long positioncode() 
    { 
     return color[nplies & 1] + color[0] + color[1] + BOTTOM; 
    } 
}; 
+0

謝謝,這看起來不錯。 – mrdmnd