2016-04-12 25 views
0

Aşağıya bkz. Onunla ilgili bir sorun var, çünkü linker Memory'un işlevlerini bulamadığı için şikayet ediyor ama nedenini anlayamıyorum. sınıf/ad memory.h olduğunu beyan EverywhereLinker bir namespace işlevi göremiyor

memory.h

#pragma once 
#include "includes.h" //it just includes other strandard headers. 

class MemoryUnit 
{ 
public: 
    MemoryUnit() {} 
    virtual int getValue() = 0; 
    virtual int getSize() = 0; 
    virtual void setValue(int) = 0; 
    virtual ~MemoryUnit() {}; 
}; 
class Byte : public MemoryUnit 
{ 
    int value; 
public: 
    static int size; 
    Byte(int byte) :value(byte) {}; 
    int getSize() { return size; } 
    int getValue() { return value; }; 
    void setValue(int byte) { value = byte; } 
    ~Byte() {}; 
}; 
namespace Memory 
{ 
    extern int size; 
    extern MemoryUnit** map; 
    void checkAddress(int address); 
    int read(int adress); 
    MemoryUnit* getOperation(int address); 
    void write(int adress, MemoryUnit* data); 
    void writeByte(int adress, int data); 
} 

memory.cpp

#include "includes.h" 
#include "memory.h" 
#include "simulator.h" // it contains only externed constants. 

namespace Memory 
{ 
    int size = 0; 
    MemoryUnit** map = NULL; 
    inline MemoryUnit* getOperation(int address) 
    { 
     return map[address]; 
    } 
    inline void checkAddress(int address) 
    { 
     if (address < 0 || address >= MAX_MEMORY_SIZE) 
      throw std::out_of_range("Invalid memory address."); 
    } 
    inline int read(int address) 
    { 
     checkAddress(address); 
     return map[address]->getValue(); 
    } 
    inline void write(int address, MemoryUnit* data) 
    { 
     checkAddress(address); 
     delete map[address]; 
     map[address] = data; 
    } 
    inline void writeByte(int address, int data) 
    { 
     checkAddress(address); 
     map[address]->setValue(data); 
    } 
} 

memory.h içerir. Aşağıdaki kodda yanlış bir şey mi var?

Düzenleme: İlk hata için

LNK1120 5 unresolved externals simulator.exe 
LNK2019 unresolved external symbol "void __cdecl Memory::writeByte(int,int)" referenced in function "void __cdecl ALU::setFlags(int)" alu.obj 
LNK2001 unresolved external symbol "void __cdecl Memory::writeByte(int,int)" cu.obj 
LNK2019 unresolved external symbol "class MemoryUnit * __cdecl Memory::getOperation(int)" referenced in function "void __cdecl CU::run(void)" cu.obj 
LNK2001 unresolved external symbol "void __cdecl Memory::writeByte(int,int)" helpers.obj 
LNK2019 unresolved external symbol "void __cdecl Memory::write(int,class MemoryUnit *)" referenced in function "void __cdecl readProgramCommands(void)" helpers.obj 
LNK2001 unresolved external symbol "public: virtual int __thiscall MemoryPointer::getValue(void)" helpers.obj 
LNK2001 unresolved external symbol "public: virtual int __thiscall IndirectMemoryPointer::getAddress(void)" helpers.obj 
LNK2001 unresolved external symbol "void __cdecl Memory::writeByte(int,int)" main.obj 

alu.h ve alu.cpp:

//alu.h 
#pragma once 
#include "includes.h" 
#include "operation.h" 
namespace ALU 
{ 
    int operation(Operation* op); 
    void setFlags(int result); 
} 
//alu.cpp 
#include "includes.h" 
#include "simulator.h" 
#include "alu.h" 
#include "memory.h" 
#include "operation.h" 
namespace ALU 
{ 
    int operation(Operation* operation) 
    { 
     // ... 
     setFlags(result); 
     return result; 
    } 
    inline void setFlags(int result) 
    { 
     Memory::writeByte(FLAG_Z, result == 0); 
     // ... 
    } 
} 
+0

Tam hata iletisini ve hatayı üreten satırı verebilir misiniz? Ayrıca, memory.cpp'yi de derlediniz ve ona karşı bağlantı kurduğunuzdan emin misiniz? – aybassiouny

+0

@aybassiouny Soruyu düzenledi. Tüm dosyalar derlenir, bağlantı VS'nin işidir. – klenium

cevap

1

satır içi işlevleri veya yöntemlerini kullanıyoruz, bunların tanımları bunları kullanan her kaynak ünitesi için görünür olmalıdır. Inlineline işlevlerinizi Memory.cpp'de tanımladınız, bu yüzden 'çözümlenmemiş' bağlayıcı hatası alıyorsunuz.

senin yapabilirsiniz sorunu çözmek için:

  1. Kaldır satır içi değiştirici ve Memory.cpp fonksiyonlar tanımlarını tutun.

  2. Satır içi değiştiriciyi tutun ancak işlev tanımlarını Memory.h dosyasına taşıyın.

+0

"Satır içi" yi saklıyorum çünkü bunlar yapabildikleri kadar hızlı olmalı. Ama ben daha üstbilgilerden/setterlerden başka başlıklar halinde yazmadım, üstbilgilerde daha karmaşık fonksiyonların taşınmasını tanımlamak iyi bir fikir midir? – klenium

+0

Çok karmaşık olursa, derleyici 'satır içi' belirticinizi yok sayar. Eğer performans programı sizin için önemli bir faktör ise, eğer satır içi tutarsanız zarar vermez. – CodeFuller

2

Sen koymak gerekir Ben Visual Studio projesi oluştururken aldığım 2015 Hataları kullanıyorum başlık dosyanızdaki satır içi işlev tanımı (her ikisi de kullanılmakta oldukları her çeviri biriminde görünmelidir), bildirim ve tanımı ayırabilir, ancak her ikisi de başlık dosyasında olmalıdır. Ayrıca, satır içi olarak bildirilmelidir.

N4140 dcl.fct.spec 7.1.2.4

An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case (3.2). [ Note: A call to the inline function may be encountered before its definition appears in the translation unit. —end note ] If the definition of a function appears in a translation unit before its first declaration as inline, the program is ill-formed.