Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中使用静态类+;_C++_File_Compilation_Header - Fatal编程技术网

C++ 在c+中使用静态类+;

C++ 在c+中使用静态类+;,c++,file,compilation,header,C++,File,Compilation,Header,我在C++中有一些简单的假设静态类: #ifndef __STAT_H_ #define __STAT_H_ class Stat { private: static vector<int> v; public: static void add_num(int num); static void clear_nums(); static void get_count(); }; #endif 编译过程中的错误是 对“Stat::add_num(int)

我在C++中有一些简单的假设静态类:

#ifndef __STAT_H_
#define __STAT_H_

class Stat {

 private:
  static vector<int> v;

 public:

  static void add_num(int num);
  static void clear_nums();
  static void get_count();
};

#endif
编译过程中的错误是

对“Stat::add_num(int)”的未定义引用

在这种情况下会出现什么问题?多谢各位


编辑:关于地址向量,很抱歉,它应该是v,在那里

听起来你好像没有在编译中包含stat.cpp。因此,您的链接器无法找到静态方法的实现。

听起来您在编译中没有包含stat.cpp。因此,您的链接器无法找到静态方法的实现。

您需要在g++命令中链接Stat.o,例如:

g++ -c -o Stat.o Stat.cpp
g++ -o Stat main.cpp Stat.o
我猜在你的Stat.cpp中:

vector<int> v;
向量v; 应该是:

vector<int> Stat::v;
向量统计:v;
如果在Stat.cpp中定义local v,则不会出现编译错误,但我猜您打算使用
Stat::v
您需要在g++命令中链接Stat.o,比如:

g++ -c -o Stat.o Stat.cpp
g++ -o Stat main.cpp Stat.o
我猜在你的Stat.cpp中:

vector<int> v;
向量v; 应该是:

vector<int> Stat::v;
向量统计:v;
如果在Stat.cpp中定义local v,则不会出现编译错误,但我猜您打算使用
Stat::v
以下是我对您的程序的看法,仅供参考

统计

生成文件


这是我对你们节目的看法,仅供参考

统计

生成文件



最有可能的是其中一个(我在看你,没有链接实现):。您还可能会发现这一点很有趣:您应该解释您正在使用的编译命令,以及您拥有的编译器。命令是:g++main.cpp注意:根据标准,您的include-guard无效。全局命名空间中的实现保留所有以前导下划线开头,后跟大写字母的名称。(由于它是一个宏,所以包含)在所有上下文中都不允许使用双下划线的名称。但这与你的问题无关,这与错误无关,但是C++中没有静态类的概念,其中最有可能的是(我在看你,没有链接实现):您还可能会发现这一点很有趣:您应该解释您正在使用的编译命令,以及您拥有的编译器。命令是:g++main.cpp注意:根据标准,您的include-guard无效。全局命名空间中的实现保留所有以前导下划线开头,后跟大写字母的名称。(由于它是一个宏,所以包含)在所有上下文中都不允许使用双下划线的名称。但这与你的问题无关,这与错误无关,但是C++中没有静态类的概念。+ 1。我还要指出,
v
的声明是错误的。它声明了一个向量
v
,而不是
Stat::v
。cpp@Sergey:但是您没有告诉编译器关于
stat.cpp
——这是定义
stat::add_num
的地方。因此,编译器(或者更确切地说,在本例中是链接器)完全可以说“我不知道在哪里可以找到这个定义”。如果我在include指令中将stat.h更改为stat.cpp,这是相同的错误+1。我还要指出,
v
的声明是错误的。它声明了一个向量
v
,而不是
Stat::v
。cpp@Sergey:但是您没有告诉编译器关于
stat.cpp
——这是定义
stat::add_num
的地方。因此,编译器(或者更确切地说,在本例中是链接器)完全可以说“我不知道在哪里可以找到这个定义”;但这并不是用户遇到的问题,这也是一个错误;但这并不是用户遇到的问题。
#include "Stat.h"

vector<int> Stat::v;

void Stat::add_num(int num) { v.push_back(num); }

void Stat::clear_nums() { v.clear(); }

int Stat::get_count() { return v.size(); }
#include "Stat.h"

int main()
{
  Stat s;
  s.add_num(8);
}
CC = g++
OBJS = Stat.o
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)

all: build clean

build: $(OBJS)
        $(CC) main.cpp $(LFLAGS) $(OBJS) -o stat

Stat.o: Stat.h
        $(CC) $(CFLAGS) Stat.cpp

clean:
        -rm -f *.o