2016-04-01 2 views
-1

Я (несколько) новичок в C++, и я пытался заставить программу работать. Все это компилируется до тех пор, пока я не начну определять конструктор класса в исходном файле, даже если я объявил его в файле заголовка. Я не уверен, что это потому, что я не определил все мои методы, потому что это моя вторая попытка определить их (я буквально переписываю их медленно, чтобы увидеть, помогает ли это).(C++) Почему определение конструктора заставляет мою программу не компилироваться?

Код в вопросе ниже (это то, что на файле CPP):

#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; 

} 

Выход я получаю ниже:

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) 

И только в случае, если человек нуждается, это класс, о котором идет речь:

class Diode : public StockItem { 

    public:  

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

     Diode(const Diode &D); 

     Diode& operator=(const Diode& D); 

     ~Diode(); 

}; 

Мой вопрос: почему это происходит при компиляции? Любая обратная связь (независимо от релевантности) очень ценится, спасибо.

+0

Вы посмотрели http://stackoverflow.com/questions/3065154/undefined-reference-to-vtable? – NPE

+2

Возможная дубликация [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-how-do-i-fix) –

+0

Предупреждения об устаревании происходят, потому что вы должны использовать 'char const *' вместо 'char *'. –

ответ

1

Ошибка возникает из-за неопределенной ссылки при связывании. Вы объявляете функции, используете их, но никогда не выполняете функции. Когда линкер связывает объектные файлы и файлы lib, он будет проверять символы экспорта и импортировать символы, а затем сопоставлять их.

Очевидно, что в вашем случае другой класс использует ваши функции, обрабатываемые как символы импорта, но в объектном файле класса не содержит функцию в таблице экспортных символов.

Смежные вопросы