获得LNK2005,我看不出我能做些什么来解决这个问题

时间:2012-02-29 20:28:32

标签: c++ visual-c++

我在每个文件中省略了#include "stdafx.h

stdafx.h(预编译头文件)

#include a.h
#include b.h
class stuff;
stuff * s

A.H

class thing{float f; void fun()};

a.cc

void thing::fun(){}
thing::thing():
    f(b->f) {} // lnk 2005 linking error

b.h

struct stuff
{
    float f;
    thing * t;
};

b.cc

stuff::stuff(): f(3.4) { t = new thing; }

main.cc

int main()
{
    s = new stuff;
    s -> fun();
}

如您所见,我尝试访问stdafx.h中预先声明的s

我正在进行这种设计,所以我不必依赖单身人士(我有一个主要类,我想在其他较小的对象中访问)

我是否需要以某种方式使用extern关键字?预编译头是否会导致问题?

3 个答案:

答案 0 :(得分:1)

在stdafx.h中,你已经声明了s,但是你从未定义它。我会:

  1. extern添加到stdafx.h
  2. 中的声明中
  3. 在main.cc中添加s的定义,如下所示:

    stuff * s = NULL;

答案 1 :(得分:0)

我建议删除全局变量。它们很危险,因为任何任务都可以读写它。在多线程和多任务系统中,控制对全局变量的访问变得必要且更复杂。

在我目前的项目中,我要求没有全局变量。可以有getter和setter的静态局部变量。使用getter和setter可以滑动模式以防止出现多任务问题。

尽力摆脱全局变量。你已经发现了一个针对他们的问题。

答案 2 :(得分:0)

通过重新设计代码解决了这个问题。 C ++使用起来不是很干净。