C++ 未解析的外部符号,对象指针数组

C++ 未解析的外部符号,对象指针数组,c++,arrays,object,linker,C++,Arrays,Object,Linker,在我的代码中,我想创建一个对象的动态数组。直到运行时,我才知道需要多少对象,而数组的类有一个动态变量数组,所以我的对象可以是任意大小的。因此,为了创建它们的数组,我想创建一个指针数组,因为指针的大小是固定的。然后,在运行时,当我知道要存储多少个对象时,我希望malloc存储指针所需的内存。当我尝试mallocing时,我会得到一个链接错误,除非我在.cpp文件的顶部定义了数组,即使它已经在header.h文件中声明了,我不确定为什么需要这样做 我的代码: Maintest.cpp #includ

在我的代码中,我想创建一个对象的动态数组。直到运行时,我才知道需要多少对象,而数组的类有一个动态变量数组,所以我的对象可以是任意大小的。因此,为了创建它们的数组,我想创建一个指针数组,因为指针的大小是固定的。然后,在运行时,当我知道要存储多少个对象时,我希望malloc存储指针所需的内存。当我尝试mallocing时,我会得到一个链接错误,除非我在.cpp文件的顶部定义了数组,即使它已经在header.h文件中声明了,我不确定为什么需要这样做

我的代码: Maintest.cpp

#include <iostream>

#include "class.h"

#include "Maintest.h"

//Class** Maintest::testArray = NULL; //uncommenting this line fixes the linking error

void Maintest::createMany(){
    testArray = (Class **) malloc(10 * sizeof(Class *));
}

int main(){
    printf("hello");
}
class.cpp

#include <iostream>

#include "class.h"

Class::Class(int arg){
    test = arg;
}

在过去,在类中声明
静态变量是不够的;您必须在一个源文件中定义它。这就是为什么取消注释该行会修复链接器错误

但从C++17开始,您可以通过在类定义中将变量声明为
静态内联
来解决这个问题:

class Maintest {
private:
    static inline Class** testArray;
public:
    static void createMany();
};

这回答了你的问题吗?这是C++的规则,你甚至自己说了。您需要一个声明(在这种情况下在头文件中)和一个定义(在这种情况下,在C++文件的顶部)。在某些情况下,相同的代码可以是声明和定义,但这不是其中之一。加上为什么你在C++程序中使用MALOC?您试图创建自己的动态数组(std::vector有什么问题?)已经够糟糕的了,但至少要用
new
而不是malloc来创建。请看一下。在
Class
声明中
Class::Class(int)应为
类(int)
@john所以为了正确处理这个问题,我不能将内存分配给头文件中声明的数组,除非我在.cpp文件中用任何值(包括null)定义它?我明白了。所以我认为分配内存不算是一个定义吗?这与内存分配无关。导致问题的是
createMany()
中对
testArray
的引用,而不是内存分配。我明白了,除非我在类中的某个地方定义静态变量,否则我不能在属于该类的函数中定义它?“在我班上的某个地方”有这样的原因吗?这是什么意思?你在你的课堂上宣布它;你必须在别的地方定义它。至少,在出现
静态内联
之前,您必须这样做。我的意思是,我需要在.cpp文件的某个地方(例如,在顶部)定义它,然后才能在类中使用它(例如,当我定义与静态变量属于同一类的方法时)。
class Class {
private:
    int test;
public: 
    Class::Class(int);
};
class Maintest {
private:
    static inline Class** testArray;
public:
    static void createMany();
};