模板类的每个实例都会复制所有静态成员。如果我想要一个对于所有实例仅存在一次的静态成员,我该怎么办?在类模板之外使用普通的静态字段?可以,但看起来不优雅,因为与模板类不再有关联。有没有办法以某种方式将这种独特的静态成员与模板类相关联?
此 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"上面代码中的链接器错误原因。是什么导致了上述代码中的链接器错误?
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() 块静态块
我有一个包含 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 测试框架。
我有一个静态回调成员函数,它通过静态内联指针调用非静态窗口过程成员函数。问题是,它最终调用了最后一个实例。这是一个演示问题核心的例子:
#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 接受参数是徒劳的。我该如何解决这个问题?
我正在尝试使用静态成员变量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) 让我先说一下,我来自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) 是否正确?
我创建了一个应用程序,它接收用户名和事务的其他详细信息,然后在数据库中填充它们.有时,应用程序通过将数据库中的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) 我有以下代码:
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对象.然后,我设置emp为null.
InstanceManager.Employee …由于我试图在标题中提供的定义,我正在捕获重复的符号错误.这是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