0

我在 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

而ccp文件是这样的:

#include "Stat.h"

vector<int> v;


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

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

int Stat::get_num_count() {
  return v.size();
}

现在,当我包含在 main.cpp 文件“Stat.h”中并尝试使用一些静态方法时:

Stat::add_num(8);

编译期间的错误是

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

在这种情况下可能会出现什么问题?谢谢你。

编辑:对不起地址向量,它应该是 v 那里

4

3 回答 3

3

听起来您没有在编译中包含 stat.cpp 。所以你的链接器找不到静态方法的实现。

于 2012-12-09T08:07:44.843 回答
1

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

g++ -c -o Stat.o Stat.cpp
g++ -o Stat main.cpp Stat.o

我猜在你的 Stat.cpp 中:

vector<int> v;

应该:

vector<int> Stat::v;

如果您在 Stat.cpp 中定义本地 v,则没有编译错误,但我猜您打算使用Stat::v

于 2012-12-09T08:11:22.217 回答
1

这是我对您的程序的看法,仅供参考。

Stat.h

#ifndef STAT_H
#define STAT_H

#include <vector>
using std::vector;

class Stat
{
 public:
  static void add_num(int num);
  static void clear_nums();
  static int get_count();

 private:
  static vector<int> v;
};

#endif

统计数据

#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
于 2012-12-09T09:20:06.047 回答