标签: static-members

具有独特静态成员的 C++ 模板

模板类的每个实例都会复制所有静态成员。如果我想要一个对于所有实例仅存在一次的静态成员,我该怎么办?在类模板之外使用普通的静态字段?可以,但看起来不优雅,因为与模板类不再有关联。有没有办法以某种方式将这种独特的静态成员与模板类相关联?

c++ templates static-members

2
推荐指数
1
解决办法
1365
查看次数

C++ 私有静态成员变量

此 C++ 代码在编译时产生链接器错误:

// A.h
class A {
    public:
        static void f();
    private:
        static std::vector<int> v;
};

// A.cpp
void A::f() {
    // this line is causing trouble
    int i = v.size();
}
Run Code Online (Sandbox Code Playgroud)

将向量声明移动到 cpp 文件中是可行的。但是我想了解"Undefined symbols"上面代码中的链接器错误原因。是什么导致了上述代码中的链接器错误?

c++ static-methods static-members linker-errors

2
推荐指数
1
解决办法
3281
查看次数

Java 编译器如何决定静态和实例成员/块的执行优先级

public class Test {
    public static void main(String str[]) {
        Hello h=Hello.INS1;
    }
}

class Hello {
 static Hello INS1=new Hello();
 static Hello INS2=new Hello(12);
{
    System.out.println("Instance Block");
}
static {
        System.out.println("Static Block");
}
private Hello() {
    System.out.println("Hello() Block");
}
private Hello(int ab) {
    System.out.println("Hello() Block");
}
}
Run Code Online (Sandbox Code Playgroud)

静态块总是先执行,但这段代码给出了一些我无法确定的东西。这里究竟发生了什么......?

输出:实例块 Hello() 块实例块 Hello() 块静态块

java compiler-construction static-members

2
推荐指数
1
解决办法
534
查看次数

谷歌测试和静态局部变量

我有一个包含 a 的方法static unsigned int,因此它可以返回连续的目录名称。就像是:

string MyClass::createDirectory() const
{
    static unsigned int i = 0;
    stringstream ss;
    string directory;
    do
    {
        ++i;
        ss.str("");
        ss << "/" << setfill('0') << setw(6) << i;
        directory = m_rootDirectory + ss.str();

    } while(!m_filesystem->createDirectory((directory)));

    return directory;
}
Run Code Online (Sandbox Code Playgroud)

我知道这是非常幼稚的解决方案,但现在已经足够了。

但是我在编写单元测试时遇到了问题——静态变量在测试用例之间递增。

有没有办法重置这样的变量?还是将静态方法变量更改为非静态类成员是我唯一的选择?

我正在使用 Google 测试框架。

c++ static unit-testing static-members googletest

2
推荐指数
1
解决办法
8403
查看次数

如何使用静态内联成员指针和静态成员函数正确的实例?

我有一个静态回调成员函数,它通过静态内联指针调用非静态窗口过程成员函数。问题是,它最终调用了最后一个实例。这是一个演示问题核心的例子:

#include <iostream>

struct A {
    static inline A* pThis;
    int i;     

    A(int i) : i(i) {
        pThis = this;
    }

    static void foo() {
        std::cout << pThis->i << std::endl;
    }
};

int main() {
    A a1(1); 
    A a2(2); 

    a1.foo(); // prints 2 instead of 1
    a2.foo(); // prints 2 as expected

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我无法更改回调函数的签名,因此建议让 foo 接受参数是徒劳的。我该如何解决这个问题?

c++ class callback static-members c++20

2
推荐指数
1
解决办法
109
查看次数

创建ID静态成员变量以跟踪类ID

我正在尝试使用静态成员变量id_index创建一个"Person"类,以跟踪创建的下一个类的ID(因此没有两个类具有相同的ID).当我运行程序时,我得到以下错误:

G:\WorkSpace\Human\Debug/../Person_Class/Person.cpp:11: multiple definition of `Person::id_index'
Person_Class\Person_Set.o:G:\WorkSpace\Human\Debug/../Person_Class/Person_Set.cpp:10: first defined here
Human.o: In function `main':
G:\WorkSpace\Human\Debug/../Human.cpp:16: multiple definition of `Person::id_index'
Person_Class\Person_Set.o:G:\WorkSpace\Human\Debug/../Person_Class/Person_Set.cpp:10: first defined here
Run Code Online (Sandbox Code Playgroud)

这是person.h文件:

#ifndef PERSON_H_
#define PERSON_H_
#include <iostream>

class Person {
public:
    static unsigned int id_index; // will aut0-set to 0
    Person();
};
unsigned int Person::id_index = 0;
#endif /* PERSON_H_ */
Run Code Online (Sandbox Code Playgroud)

person.cpp:

Person::Person(): ID(id_index) {

}
Run Code Online (Sandbox Code Playgroud)

存储在human.cpp中的主要功能:

int main(){
    Person michael;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ program-entry-point static-members

1
推荐指数
1
解决办法
1307
查看次数

PHP静态类成员范围

让我先说一下,我来自Java背景.

PHP中静态类成员的范围是什么?即:请求,会话,服务器生命周期等

我目前的理解是,一切都是请求,除非它被困在会话上.我在" 语言指南"中没有发现任何反驳或证实这一点的内容.

class MyKlass {
    public static $K_PAGE_SIZE = 50;
    public static $K_WITH_SPRINKLES = true;
}

if (isset($_GET['NO_SPRINKLES'])) {
    MyKlass::$K_WITH_SPRINKLES = false;
}

var_dump(MyKlass::$K_WITH_SPRINKLES);
Run Code Online (Sandbox Code Playgroud)

情况1

如果我要查看具有此代码的页面,查询行中没有任何内容,我应该看到

bool(true)
Run Code Online (Sandbox Code Playgroud)

案例2

如果我使用此代码访问页面并?NO_SPRINKLES=true在查询行中,我应该看到

bool(false)
Run Code Online (Sandbox Code Playgroud)

案例3

如果我?NO_SPRINKLES=true在查询行中访问该页面然后访问没有它的页面,我应该总是看到 bool(true) 对吗?

案例4

访问与该页面后?NO_SPRINKLES=true,其他人谁访问的页面还是要看 bool(true) 是否正确?

php oop scope static-members

1
推荐指数
1
解决办法
833
查看次数

如何在Android活动结束时清除所有静态变量的值?

我创建了一个应用程序,它接收用户名和事务的其他详细信息,然后在数据库中填充它们.有时,应用程序通过将数据库中的SAME详细信息填充两次作为两个事务来显示奇怪的行为.即使在静态变量中读取了新值但未存储STORED.

因此,我需要帮助在每个活动结束时刷新所有静态变量的值,以避免覆盖新事务中的先前值.

编辑:

  public class One
      {
  static String var;

      public void onCreate(Bundle savedInstanceState)
    {    
      super.onCreate(savedInstanceState);
              var="blah";
         }
   }

          public class Two
            {
              static String variable = One.var;
               // This is where i am accessing the value of the variables from previous activities.

              //CODE
            }
Run Code Online (Sandbox Code Playgroud)

android static-members

1
推荐指数
1
解决办法
2406
查看次数

当存储该引用的局部变量设置为null时,为什么静态变量未设置为null?

我有以下代码:

public class Employee
{
    public string Name { get; set; }
}

public class InstanceManager
{
    public static Employee employee;

    public static Employee GetEmployee()
    {
        if(employee == null)
        {
            employee = new Employee {Name = "Tom"};
        }

        return employee;
    }
}

public class TestClass
{

    public void Test()
    {
        Employee emp = InstanceManager.GetEmployee();
        var name = emp.Name;
        emp = null;
        var name2 = InstanceManager.GetEmployee().Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

在该Test()方法中,局部变量emp引用InstanceManager.Employee对象.然后,我设置empnull.

  • 这是不是意味着我要InstanceManager.Employee …

.net c# static-members pass-by-reference

1
推荐指数
2
解决办法
2795
查看次数

由于标头中的专业化初始化而避免重复的符号?

由于我试图在标题中提供的定义,我正在捕获重复的符号错误.这是Minimal,Complete和Verifiable示例中的错误.头文件和源文件如下所示.

$ clang++ main.cpp x.cpp y.cpp -o main.exe 2>&1 | c++filt
duplicate symbol Id<S>::id in:
    /tmp/main-3f2415.o
    /tmp/long long-d62c28.o
duplicate symbol Id<T>::id in:
    /tmp/main-3f2415.o
    /tmp/long long-d62c28.o
duplicate symbol Id<S>::id in:
    /tmp/main-3f2415.o
    /tmp/unsigned long long-bfa6de.o
duplicate symbol Id<T>::id in:
    /tmp/main-3f2415.o
    /tmp/unsigned long long-bfa6de.o
ld: 4 duplicate symbols for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

这是一个类似的问题,但它不涉及专门化:类模板中的静态成员初始化.这个问题有专门化,但它适用于MSVC而不是Clang:如何初始化参数化模板类的静态成员.并且这个问题表明它将它放在源(*.cpp)文件中,但我们的目标是避免使用头文件Clang 3.8和'Id<S>::id' required here, but no definition is available警告:类模板的显式特化的定义应放在C++中的哪个位置?

初始化时,GCC,ICC,MSVC,SunCC和XLC都可以.Clang和LLVM给了我麻烦.Clang和LLVM在专门化的明确实例化方面也遇到了麻烦extern,因此它拥有特殊的地狱.

我们支持C++ 03但是C++ 17,所以我们必须小心这个解决方案.天真地,我尝试将特化的初始化放在一个未命名的命名空间中,以防止符号转义转换单元,但这导致了编译错误.

在标头中初始化和专门化模板类时,我们如何避免重复的符号定义?


下面是MCVE,它是一个cat main.cpp a.h s.h s.cpp t.h …

c++ templates initialization static-members template-specialization

1
推荐指数
1
解决办法
276
查看次数