【问题标题】:Unresolved external symbol, array of object pointers未解析的外部符号,对象指针数组
【发布时间】:2020-10-26 16:48:21
【问题描述】:

在我的代码中,我想创建一个动态对象数组。直到运行时我才知道我想要多少个对象,并且数组的类有一个动态变量数组,所以我的对象可以是任意大小。因此,要制作它们的数组,我想创建一个指针数组,因为指针的大小是固定的。然后,在运行时,当我知道要存储多少对象时,我想分配存储指针所需的内存。当我尝试 mallocing 时,我得到一个链接错误,除非我在 .cpp 文件的顶部定义数组,即使它已经在头 .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");
}

Maintest.h

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

class.cpp

#include <iostream>

#include "class.h"

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

类.h

class Class {
private:
    int test;
public: 
    Class::Class(int);
};

【问题讨论】:

  • 这能回答你的问题吗? Undefined reference to static class member
  • 这是C++的规则,你自己也说了。您需要一个声明(在这种情况下在头文件中)和一个定义(在这种情况下在 C++ 文件的顶部)。在某些情况下,相同的代码可以是声明和定义,但这不是其中一种情况。另外,为什么在 C++ 程序中使用 malloc?您尝试创建自己的动态数组已经够糟糕了(std::vector 有什么问题?)但至少使用 new 而不是 malloc。
  • 请看std::vector
  • Class 声明中Class::Class(int); 应该是Class(int);
  • @john 所以为了做到这一点,我不能为头文件中声明的数组分配内存,除非我在 .cpp 文件中用任何值(包括 null)定义它?

标签: c++ arrays object linker


【解决方案1】:

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

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

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

【讨论】:

  • 我明白了。那么我认为分配内存不算作一个定义?
  • 这与内存分配无关。导致问题的是 createMany() 中对 testArray 的引用,而不是内存分配。
  • 我明白了,所以除非我在类中的某处定义静态变量,否则我不能在属于该类的函数中定义它?这是有原因的吗?
  • “我班上的某个地方”?这意味着什么?您在课堂上声明它;你必须在其他地方定义它。至少,在static inline 出现之前,您确实必须这样做。
  • 对。我的意思是我需要在我的 .cpp 文件中的某个位置(例如顶部)定义它,然后才能在我的类中使用它(即,当我定义一个与静态变量属于同一类的方法时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2014-01-06
  • 2015-06-27
  • 2021-12-04
相关资源
最近更新 更多