(C++)为什么定义构造函数会导致我的程序无法编译

(C++) Why is it that defining a constructor causes my program to not compile?

本文关键字:我的 程序 编译 C++ 为什么 定义 构造函数      更新时间:2023-10-16

我(有点)刚接触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:EDUCATIONUniversityYear 2Year CoursesPROGRAMMING 2AssignmentsAssignment 2COURSEWORK_100088688StockProgram_C++'
C:cygwinbinmake.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();
};

我的问题是,为什么这会影响汇编?非常感谢任何反馈(无论相关性如何),谢谢。

链接时错误来自未定义的引用。您声明、使用这些函数,但从不实现这些函数。当链接器链接对象文件和库文件时,它会检查导出符号和导入符号,然后将它们匹配在一起。

很明显,在您的情况下,其他类使用您的函数,这些函数被视为导入符号,但在类的对象文件中,不包含导出符号表中的函数。

相关文章: