C ++:我可以将非静态成员变量的值赋给静态成员变量吗?

时间:2016-01-25 16:16:16

标签: c++ static

我有一个班级A,其中我有一个静态成员函数passName

int A::passName()
{
  .... // skip some code
  std::string name = ...; // result from codes above
  assign(); // this is a static member function in class A
  pointerA->passMethodName(name); // pointerA is a class-A static member variable, but of type 
                                 // class-B, passMethodName is a class-B non-static member function.
}

assign函数是:

void A::assign(){
  pointerA = tempPointerA;
}

说明:tempPointerA是在运行过程中生成的值。它是一个非静态私有类A成员,每次构造一个新的A类对象时都会对其进行初始化。但我知道在静态函数中我只能直接使用静态成员,所以我需要确保指针A是静态成员。那么assign()函数是否可行(或者我宁愿说,这里显示的整个工作原理是否可行)?

谢谢你的想法!

3 个答案:

答案 0 :(得分:2)

没有。静态成员函数只能对静态变量进行操作或调用其他静态函数。 (或命名空间范围函数,它们与静态函数或多或少相同)。

  

§9.4.1[class.static.mfct]

     

静态成员函数没有this指针。

因此无法在static函数中访问非静态成员变量。

如果您确实需要assign保留static, then what you should do is to refactor your assign()function to accept a variable of type tempPointerA`,然后传递所需的变量。

int A::passName(B* _in)
{
  std::string name = ...; // result from code above
  assign(_in); // this is a static member function in class A
  _in->passMethodName(name);
}

否则我建议你根本不要static

答案 1 :(得分:0)

分配值将起作用,但您需要从非静态方法(以访问tempPointerA)或将指针作为参数传递给静态方法。您可以从非静态函数访问静态成员(但不是相反)。

你应该注意的是所有权和破坏。由于您将值分配给静态成员,因此实例不再拥有该值。否则,当实例被销毁时,静态成员指向垃圾数据并且您会收到错误。此外,由于静态成员永远不会被破坏,因此您的值可能会泄漏资源(认为数据库连接从未关闭)。

此外,如果您处于多线程环境中,请考虑多个线程是否可能尝试设置静态成员的值。您可以添加同步。如果多个线程试图同时初始化该值,您也可能遇到竞争条件。

答案 2 :(得分:0)

有一条规则:静态函数无法访问非静态成员和没有对象的同一类的函数。没有相反的规则。这是因为你没有this指针。

您仍然可以在静态函数中声明同一个类的对象,并使用它的所有成员,或者使用任何静态成员。

因此,从非静态功能,您可以访问静态函数和成员。

如果pointerA是静态的,您可以全部访问它。不仅仅是它的静态成员和功能。