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 で local 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

Stat.cpp

#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(); }

main.cpp

#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 に答える