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

fumotvh3  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(146)

这是我的代码文件

VectorNumbeList.cpp

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

VectorNumberList.h

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

NumberList.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变量。

tkclm6bt

tkclm6bt1#

该错误主要与size变量的多个定义以及对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

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

mznpcxlj

mznpcxlj2#

VectorNumberList.h

extern int* vect;

但这只是一个声明,而不是定义。你需要相应的定义:

int* vect;

在你的cpp文件中。然后它将链接没有错误。

相关问题