我想做什么:每当要在程序中使用类的实例时运行一些先决条件代码.此代码将检查要求等,并且只应运行一次.
我发现这可以使用另一个对象作为构造函数内的静态变量来实现.这是一个更好的图片示例:
class Prerequisites
{
public:
Prerequisites() {
std::cout << "checking requirements of C, ";
std::cout << "registering C in dictionary, etc." << std::endl;
}
};
class C
{
public:
C() {
static Prerequisites prerequisites;
std::cout << "normal initialization of C object" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
困扰我的是,到目前为止我还没有看到类似的静态变量.是否有任何缺点或副作用或我遗失了什么?或者也许有更好的解决方案?欢迎任何建议.
我喜欢这样的
class A:
__a = 0
def __init__(self):
A.__a = A.__a + 1
def a(self):
return A.__a
class B(A):
def __init__(self):
# how can I access / modify A.__a here?
A.__a = A.__a + 1 # does not work
def a(self):
return A.__a
Run Code Online (Sandbox Code Playgroud)
我可以访问__a类变量B吗?这可能是写作a而不是__a,这是唯一的方法吗?(我猜答案可能很短:是的:)
如果我在一个类的(非静态)成员函数中声明了一个静态变量,它对该类的每个实例是静态的,还是在所有实例中是静态的?对不起,如果答案显而易见,我无法在任何地方找到它.
编辑:
我接受了zerkms的回答,但这是另一个例子:
<?php
class X {
public function fun($bar) {
static $foo = null;
if ($foo != null) print $foo . "<br/>";
$foo = $bar;
}
}
$x1 = new X();
$x1->fun(42);
$x2 = new X();
$x2->fun(123);
$x2->fun(666);
?>
Run Code Online (Sandbox Code Playgroud)
产出:
42
123
我CURRENT_DIR在我的程序中多次打电话(见下文).就像程序运行时不可更改的可执行路径一样,每次调用此函数时都无需再次定义它.
所以,我正在寻找一个解决方案,一旦这个值设置,它就不应该再次设置.
我当前的解决方案是:创建一个静态变量,将所有值设置为0,并在if语句测试中检查第一个字符是否为非null,如果为true,则设置它.但它看起来像一个不优雅的..也许有一个更好的解决方案..通过使用包括宏的一些模型,我不知道.
看代码:
#define CURRENT_DIR ({ \
static char buffer[MAX_PATH + 1] = { 0 }; \
if(buffer[0] != '\0') \
getcurrentdir(buffer, MAX_PATH); \
buffer; \
})
Run Code Online (Sandbox Code Playgroud) 可能重复:
在C++中拆分字符串
我试图创建一个模仿函数行为的getline()函数,可以选择使用分隔符将字符串拆分为标记.该函数接受2个字符串(第二个是通过引用传递)和一个char分隔符的类型.它遍历第一个字符串的每个字符,将其复制到第二个字符串,并在到达分隔符时停止循环.true如果第一个字符串在分隔符后面有更多字符,则返回,false否则返回.最后一个字符的位置保存在静态变量中.由于某种原因,程序进入无限循环并且没有执行任何操作:
const int LINE_SIZE = 160;
bool strSplit(string sFirst, string & sLast, char cDelim) {
static int iCount = 0;
for(int i = iCount; i < LINE_SIZE; i++) {
if(sFirst[i] != cDelim)
sLast[i-iCount] = sFirst[i];
else {
iCount = i+1;
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
该功能以下列方式使用:
while(strSplit(sLine, sToken, '|')) {
cout << sToken << endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么它会进入一个无限循环,为什么它不起作用?我应该补充说istringstream,如果可能的话,我对没有使用的解决方案感兴趣.
静态变量"声明变量static将其范围限制为仅仅类 - 并且仅限于在文件中实现的类的部分"(Apple doc).
而且我认为在类扩展中定义的变量只有在定义它的类中才有限制范围.
那是类似的!
类扩展中的静态变量和变量有什么不同?
假设我们使用本地静态变量具有最简单的函数:
int f()
{
static int a = 0;
return ++a;
}
Run Code Online (Sandbox Code Playgroud)
让我们多次调用此函数并打印结果:
int main()
{
int a = f();
int b = f();
std::cout<<a<<b;
}
Run Code Online (Sandbox Code Playgroud)
输出为"12" - 正如预期的那样.但是这个电话
int main()
{
std::cout<<f()<<f();
}
Run Code Online (Sandbox Code Playgroud)
产生相反的顺序 - "21".为什么?
我在解决方案中有两个项目(将它们视为project1和project2).第一个项目(project1)包含一个包含全局变量的类
public static class GlobalTrackInfo
{
public static string tracktitle { get; set; }
public static Uri trackUri { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在project2中添加了project1的引用,并在project2的类中设置了静态变量的值,如下所示
GlobalTrackInfo.tracktitle = "myTitle";
GlobalTrackInfo.trackUri = new Uri("www.example.com");
Run Code Online (Sandbox Code Playgroud)
后来我尝试在project1类中访问这些变量
Title = GlobalTrackInfo.tracktitle;
Run Code Online (Sandbox Code Playgroud)
但它似乎是空的.我究竟做错了什么?是否不可能在不同项目中使用全局变量?
我正在编写一个数据混搭功能,我正在修改一段动态比特破碎音频滤波器的音频数据.我很方便使用静态变量,因为它们的值在函数调用之间延续,这有助于我通过在渲染回调中递增等来实现一些有趣的基于时间的效果.
例如,一种效果使用sin函数来调整一些声音效果.像这样:
void mangle(float * data, int n) {
static bool direction = false;
static float bottom = 0;
static float top = n;
static float theta = 0;
theta += 5;
// data = sin(theta) etc..
Run Code Online (Sandbox Code Playgroud)
所以我希望theta初始化一次,然后再修改.同样,top想要成为静态变量,因为我稍后在函数中修改它.另外,由于基于程序状态的变化,top应该采取参数的值.但是当我去分配时,我得到了编译器错误nnntop
Initializer element is not a compile-time constsant.
有没有办法将参数分配给静态变量?有没有其他方法可以实现我想要的没有静态变量?我知道我可以使用实例变量,但我发现它太多了.
我和同事讨论了这段代码:
public final class ShutdownHookRegistration {
/**
* Global shutdown flag
*/
private static boolean isServerShutdown = false;
private ShutdownHookRegistration() {
// empty
}
/**
* Returns the current value of the global shutdown flag
*
* @return
*/
public static boolean isServerShutdown() {
return isServerShutdown;
}
/**
* Registration if shutdown hooks
*/
public static void registerShutdownHooks() {
/**
* 1. Shutdown hook to set the shutdown flag
*/
Runtime.getRuntime().addShutdownHook(setGlobalShutdownFlag());
}
/**
* Sets the global static is shutdown …Run Code Online (Sandbox Code Playgroud) java multithreading volatile static-variables java-memory-model
static-variables ×10
c++ ×3
c ×2
function ×2
c# ×1
class ×1
constructor ×1
gcc ×1
inheritance ×1
instance ×1
java ×1
objective-c ×1
optimization ×1
php ×1
python ×1
scope ×1
string ×1
volatile ×1