【问题标题】:Using static class in c++在 C++ 中使用静态类
【发布时间】:2012-12-09 08:03:20
【问题描述】:

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

【问题讨论】:

  • 最有可能是其中之一(我在看着你,没有链接实现):stackoverflow.com/questions/12573816/…。你也可能会觉得这很有趣:stackoverflow.com/questions/228783/…
  • 你应该解释你正在使用什么编译命令,你有什么编译器。
  • 命令为:g++ main.cpp
  • 注意:根据标准,您的包含保护无效。所有以前导下划线后跟大写字母开头的名称都由全局命名空间中的实现保留。 (因为它是一个宏,所以包含在内)在所有上下文中都不允许使用双下划线的名称。但这与您的问题无关。
  • 这个和报错无关,但是C++中没有静态类的概念。

标签: c++ file compilation header


【解决方案1】:

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

【讨论】:

  • +1。我还要注意v 的声明是错误的。它声明了一个向量v,而不是Stat::v
  • 我将 stat.h 包含在 main.cpp 中
  • @Sergey:但是你没有告诉编译器stat.cpp——这是定义Stat::add_num的地方。所以编译器(或者更确切地说,在这种情况下是链接器)说“我不知道在哪里可以找到这个定义”是完全可以的。
  • 如果我在 include 指令中将 stat.h 更改为 stat.cpp,同样的错误
【解决方案2】:

你需要在 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

【讨论】:

  • 这也是一个错误;但它不是用户遇到问题的那个。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多