C++ 在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)
#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