C++ 创建一个字符数组,其大小由参数-C++;

C++ 创建一个字符数组,其大小由参数-C++;,c++,static-array,C++,Static Array,我有一个带有静态字符数组的类。 数组的大小在argv中给出 我想做这样的事情: class ABC { public: static char *buffer; ABC(int size) { ABC::buffer = new char[size]; } } // in other file: ABC tempVar(atoi(argv[1])); 但这似乎不起作用。我会遇到如下错误: 错误2错误LNK2001:未解析的外部符号“public:静态字符 *ABC:

我有一个带有静态字符数组的类。 数组的大小在
argv
中给出

我想做这样的事情:

class ABC {

public:
  static char *buffer;
  ABC(int size) {
    ABC::buffer = new char[size];
  }

}

// in other file:

ABC tempVar(atoi(argv[1]));
但这似乎不起作用。我会遇到如下错误:

错误2错误LNK2001:未解析的外部符号“public:静态字符 *ABC::缓冲区“(?)?buffer@ABC@@2PADA)gpslib.lib


如何修复此问题?

您需要准确地定义一次
静态缓冲区,它只声明了一次。将以下内容添加到一个
.cpp
文件中:

char* ABC::buffer;
请注意,每次创建
ABC
实例时,先前分配的
缓冲区将丢失(内存泄漏),这不是您想要的


更健壮的解决方案将
缓冲区
作为实例(非静态)成员。一个更健壮的解决方案将使用
std::string
而不是
char*
,并为您管理动态内存分配。

您需要准确定义
静态缓冲区一次,它只声明过一次。将以下内容添加到一个
.cpp
文件中:

char* ABC::buffer;
请注意,每次创建
ABC
实例时,先前分配的
缓冲区将丢失(内存泄漏),这不是您想要的


更健壮的解决方案将
缓冲区
作为实例(非静态)成员。一个更健壮的解决方案是使用
std::string
而不是
char*
,并为您管理动态内存分配。

您不想这样做。童车,有什么用?我看不出有什么意义。另外,避免使用
atoi
。使用
std::stoi
(由C++11引入)。@Nawaz-有什么区别?@kakush:区别在于
std::stoi
会让您知道参数是否无效(或有超长),而
std::atoi
会保持沉默。@VladLazarenko-我在其他地方使用这个缓冲区-这就是它是静态的原因。我只有这个类的一个实例,所以不应该有任何bug。你不想做这样的事情。童车,有什么用?我看不出有什么意义。另外,避免使用
atoi
。使用
std::stoi
(由C++11引入)。@Nawaz-有什么区别?@kakush:区别在于
std::stoi
会让您知道参数是否无效(或有超长),而
std::atoi
会保持沉默。@VladLazarenko-我在其他地方使用这个缓冲区-这就是它是静态的原因。我只有这个类的一个实例,所以不应该有任何bug。