2013-05-30 194 views
-1

在下面的代码:静态函数和非静态变量

class A 
{ 
public: 
    static void StaticFunction(int variable){ } 
    void NonStaticFunction() { } 

private: 
    int nonStaticVariable; 
}; 

我需要得到一个“变量”和“NonStaticFunction”

我已经尝试做“nonStaticVariable”静态和分配使用它的值为'变量',但是我仍然必须在'NonStaticFunction'中使用静态变量,这会引发链接器错误。

Error 2 error LNK2001: unresolved external symbol "public: static unsigned int A::staticVariable" ([email protected]@@2IA) 

有没有解决它的办法?

+0

我不知道你想在这里实现什么......你想要的设置为的所有实例的一些数据类,并且你需要在(non-'static')成员函数中使用这些数据? – BoBTFish

+1

这个错误并不是因为你在一个非静态函数中使用静态变量,而是因为你必须**定义**(即告诉编译器为它分配内存而不是声明它)你的静态变量通过添加int A :: staticVariable;'在代码中的某处。 –

回答

4

您需要在命名空间内添加定义您的静态数据成员

int A::nowStaticVariable; // Put an initializer if 0 is not OK for you 

但是,如果你的静态函数需要访问非静态数据成员,而你被迫使这个数据成员是静态的,以使整个事情工作,这闻起来像糟糕的设计。考虑重新考虑它。

+0

+1,特别是对于“糟糕的设计”部分。 – Angew

+0

@Angew万岁winapi和函数指针...;) – Neomex

+0

@Neomex嗯,WinAPI是C,而不是C++。在这种情况下,可以预期的互操作代码会很难看。 – Angew

2

如果您制作nonStaticVariable静态;即

static int nonStaticVariable; 

在你的班级,然后你需要为它提供存储(或链接器会抱怨)。这被称为的定义。通过写

int A::nonStaticVariable; 

有趣的是,这是初始化为零(未初始化在C和C不像非静力学++)做在一个源文件。

从概念上讲,您需要这样做,因为没有类A的对象实例化静态变量,因为它不是实例级数据成员。

1

您不必使用该参数在静态函数