2016-04-01 43 views
-1

Ben C++ için yeni (ve) yeni ve çalışmak için bir program almaya çalışıyorum. Başlık dosyasında bildirmiş olmama rağmen, kaynak dosya içinde bir sınıf kurucusu tanımlamaya başlayana kadar hepsi derler. Eminim, tüm yöntemlerimi tanımlamam, çünkü bu onları tanımlamaktaki ikinci denememdir (tam anlamıyla onları yardım edip edemeyeceğimi görmek için yeniden yazıyordum).(C++) Neden bir kurucu tanımlamak programımın derlenmemesine neden oluyor?

söz konusu kodu (bu cpp dosyası üzerinde budur) aşağıdaki gibidir:

#include <cstdlib> 
#include <iostream> 
#include <string.h> 
#include "StockItem.h"  

Diode::Diode(char* componentT, char* code, int quantity, int price){ 

    strcpy(componentType,componentT); 
    strcpy(stockCode,code); 
    stockQuantity = quantity; 
    unitPrice = price; 

} 

aldığım çıktı aşağıdaki gibidir:

cd 'G:\EDUCATION\University\Year 2\Year Courses\PROGRAMMING 2\Assignments\Assignment 2\COURSEWORK_100088688\StockProgram_C++' 
C:\cygwin\bin\make.exe -f Makefile CONF=Debug 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf 
make[1]: Entering directory '/cygdrive/g/EDUCATION/University/Year 2/Year Courses/PROGRAMMING 2/Assignments/Assignment 2/COURSEWORK_100088688/StockProgram_C++' 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin-Windows/stockprogram_c__.exe 
make[2]: Entering directory '/cygdrive/g/EDUCATION/University/Year 2/Year Courses/PROGRAMMING 2/Assignments/Assignment 2/COURSEWORK_100088688/StockProgram_C++' 
mkdir -p build/Debug/Cygwin-Windows 
rm -f "build/Debug/Cygwin-Windows/StockItem.o.d" 
g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/Cygwin-Windows/StockItem.o.d" -o build/Debug/Cygwin-Windows/StockItem.o StockItem.cpp 
StockItem.cpp: In member function 'void StockItem::setComponentType(char*)': 
StockItem.cpp:27:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    char* S1 = "resistor"; 
       ^
StockItem.cpp:28:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    char* S2 = "capacitor"; 
       ^
StockItem.cpp:29:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    char* S3 = "transistor"; 
       ^
StockItem.cpp:30:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    char* S4 = "diode"; 
       ^
StockItem.cpp:31:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 
    char* S5 = "ic"; 
       ^
mkdir -p build/Debug/Cygwin-Windows 
rm -f "build/Debug/Cygwin-Windows/StockProgram.o.d" 
g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/Cygwin-Windows/StockProgram.o.d" -o build/Debug/Cygwin-Windows/StockProgram.o StockProgram.cpp 
mkdir -p dist/Debug/Cygwin-Windows 
g++  -o dist/Debug/Cygwin-Windows/stockprogram_c__ build/Debug/Cygwin-Windows/StockItem.o build/Debug/Cygwin-Windows/StockProgram.o 
build/Debug/Cygwin-Windows/StockItem.o: In function `ZN9StockItemC2Ev': 
/cygdrive/g/EDUCATION/University/Year 2/Year Courses/PROGRAMMING 2/Assignments/Assignment 2/COURSEWORK_100088688/StockProgram_C++/StockItem.h:8: undefined reference to `vtable for StockItem' 
build/Debug/Cygwin-Windows/StockItem.o:StockItem.cpp:(.rdata$_ZTV5Diode[__ZTV5Diode]+0x8): undefined reference to `StockItem::getComponentInfo()' 
build/Debug/Cygwin-Windows/StockItem.o:StockItem.cpp:(.rdata$_ZTV5Diode[__ZTV5Diode]+0xc): undefined reference to `StockItem::setComponentInfo(char*)' 
collect2: error: ld returned 1 exit status 
nbproject/Makefile-Debug.mk:63: recipe for target 'dist/Debug/Cygwin-Windows/stockprogram_c__.exe' failed 
make[2]: *** [dist/Debug/Cygwin-Windows/stockprogram_c__.exe] Error 1 
make[2]: Leaving directory '/cygdrive/g/EDUCATION/University/Year 2/Year Courses/PROGRAMMING 2/Assignments/Assignment 2/COURSEWORK_100088688/StockProgram_C++' 
nbproject/Makefile-Debug.mk:60: recipe for target '.build-conf' failed 
make[1]: *** [.build-conf] Error 2 
make[1]: Leaving directory '/cygdrive/g/EDUCATION/University/Year 2/Year Courses/PROGRAMMING 2/Assignments/Assignment 2/COURSEWORK_100088688/StockProgram_C++' 
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed 
make: *** [.build-impl] Error 2 

BUILD FAILED (exit value 2, total time: 5s) 

Ve tıpkı insanlar ihtiyaç halinde, Bu, söz konusu sınıftır:

class Diode : public StockItem { 

    public:  

     Diode(char* componentT, char* code, int quantity, int price); 

     Diode(const Diode &D); 

     Diode& operator=(const Diode& D); 

     ~Diode(); 

}; 

Sorunun nedeni bu derlemeyi etkiliyor mu? Herhangi bir geri bildirim (alaka düzeyine bakılmaksızın) büyük takdir, teşekkür ederim.

+0

http://stackoverflow.com/questions/3065154/undefined-reference-to-vtable adresine baktınız mı? – NPE

+2

Olası çoğaltılabilir [Tanımlanmamış bir referans/çözümlenmemiş dış sembol hatası nedir ve nasıl giderebilirim?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- simge hatası ve nasıl yapılır) –

+0

Kullanımdan kaldırılma uyarıları oluyor çünkü char * 'yerine 'char const *' kullanmalısınız. –

cevap

1

Bağlantı, bağlantı kurulurken tanımlanmamış referanstan geliyor. İşlevleri beyan ediyor, kullanıyorsunuz ama asla işlevleri uygulamıyorsunuz. Linker, nesne dosyalarını ve lib dosyalarını birbirine bağladığında, dışa aktarma simgelerini kontrol eder ve sembolleri içe aktarır, ardından bunları birlikte eşleştirir.

Durumunuzda, diğer sınıf işlevlerinizi kullanın, içe aktarma sembolleri olarak kabul edilir, ancak sınıfın nesne dosyasında, dışa aktarma sembolleri tablosunda işlev bulunmaz.