代码之家  ›  专栏  ›  技术社区  ›  scurry200

正在获取“size”的多个定义和对“vect”错误的未定义引用,不确定如何解决,C++

  •  0
  • scurry200  · 技术社区  · 3 年前

    这是我的代码文件

    VectorNumbeList.cpp

    #include <iostream>
    #include "VectorNumberList.h" 
        void initialize() {
            vect = new int[10];}
    

    矢量编号列表。h

    #include <vector>
    #include <cstdlib>
    #include "NumberList.h"
    extern int* vect;
    size_t size_real;
    void initialize(); 
    

    数字列表。h

    #ifndef NUMBER_LIST_H
    #define NUMBER_LIST_H
    
    #include <cstdlib>
    
    
    class NumberList {
    public:
        virtual void addNumberToList(int num) = 0;
        virtual void removeNumberFromFront() = 0;
        virtual void removeNumberFromBack() = 0;
        virtual int getNumberAt(size_t index) = 0;
        virtual size_t getSizeOfList() = 0;
        virtual void clear() = 0;
    
        void printNumbers();
        void computeNextFibonacciAndInsertAtEnd();
        void computeNFibonacci(size_t n);
        void copyListIntoMe(NumberList &numList);
        void reverseList();
        
    };
    
    #endif
    

    runner.cpp

    #include <iostream>
    #include <string>
    #include <vector>
    #include "VectorNumberList.h"
    
    
    int main() {
        initialize();
        return 0;
    }
    

    Makefile(runner是文件夹名称,与runner.cpp不同)

    CXX=g++
    runner: runner.cpp VectorNumberList.cpp
        $(CXX) runner.cpp VectorNumberList.cpp -o runner
    
    
    clean:
        rm runner *~
    

    我的错误最终与链接有关,但我不确定如何解决它。非常困惑,非常感谢帮助。 错误语句

    g++ runner.cpp VectorNumberList.cpp -o runner
    /tmp/ccJYylpB.o:(.bss+0x0): multiple definition of `size'
    /tmp/ccLyM4kA.o:(.bss+0x0): first defined here
    /tmp/ccJYylpB.o: In function `initialize()':
    VectorNumberList.cpp:(.text+0x11): undefined reference to `vect'
    collect2: error: ld returned 1 exit status
    Makefile:3: recipe for target 'runner' failed
    make: *** [runner] Error 1
    

    我试图通过在runner.cpp或vectornumberlist.cpp中删除include语句来修改它们,但我运气不佳。我很失落,因为我是C++的新手。它与头文件有关,但除了从vectornumberlist.h文件中删除vect和size变量外,我不确定如何处理。

    2 回复  |  直到 3 年前
        1
  •  1
  •   orabis    3 年前

    该错误主要与大小变量的多个定义以及对vect变量的未定义引用有关。

    这是因为您已经在头文件VectorNumberList.h中将这些变量声明为extern,但尚未在任何源文件中定义它们。

    您需要从vect的声明中删除extern关键字。 在VectorNumberList.cpp中定义vect变量

    int* vect;
    

    在VectorNumberList.cpp中,定义大小变量

    size_t size_real;
    

    更新后的VectorNumberList.cpp:

    #include <iostream>
    #include "VectorNumberList.h" 
    
    int* vect;
    size_t size_real;
    
    void initialize() {
        vect = new int[10];
    }
    

    更新后的VectorNumberList.h::

    #ifndef VECTOR_NUMBER_LIST_H
    #define VECTOR_NUMBER_LIST_H
    
    #include <cstdlib>
    
    extern int* vect;
    extern size_t size_real;
    
    void initialize();
    
    #endif
    

    我希望这能解决你的问题。

        2
  •  0
  •   TonyK    3 年前

    VectorNumberList.h

    extern int* vect;
    

    但这只是一个宣言,而不是一个定义。您需要相应的定义:

    int* vect;
    

    在你的一个 cpp 文件。然后它将链接而不会出现错误。