可能重复:
静态变量
如何从C中的另一个文件访问静态变量?由于静态变量具有文件范围,我认为我们无法在文件外访问它.但我仍然觉得可能有一些技巧或方法来做同样的事情.
最近我发现了一个我想在我的 C++ 项目中使用的 C 库。该代码配置了全局变量,并将其输出写入静态指针指向的内存。当我执行我的项目时,我希望运行 2 个 C 程序实例:一个具有配置 A,一个具有配置 B。我不能运行我的程序两次,所以我认为有 2 个选项:
哪一种是最快的解决方案?是否有其他可能性来运行同一 C 源代码的 2 个实例?
谢谢,
最大限度
我正在编写一个XNA引擎,我将所有模型存储在一个List.为了能够在整个引擎中使用它,我已经做了这个,public static List<Model>所以我可以从我开发的任何新类访问它.它当然使获得模型列表真的很容易获得,但这是正确的用法吗?或者我会更好地在方法声明中传递变量?
有没有办法在该类之外声明新的静态变量,即使它没有在类中设置?
// Using this class as a static object.
Class someclass {
// There is no definition for static variables.
}
// This can be initialized
Class classA {
public function __construct() {
// Some codes goes here
}
}
/* Declaration */
// Notice that there is no static declaration for $classA in someclass
$class = 'classA'
someclass::$$class = new $class();
Run Code Online (Sandbox Code Playgroud)
如何做呢?
谢谢您的建议。
我最近从 Java 过渡到 C++,在弄清楚类继承的确切工作原理方面遇到了一些困难。目前,我有班级Weapon和班级Minigun。Minigun继承该类Weapon,这意味着它应该具有定义的方法和变量Weapon。我的问题是,我有一个名为 的私有常量 static int Weapon,rate以及一个返回名为 的整数的公共方法getRate()。getRate()只是返回类中定义的速率变量。当Minigunextends Weapon,并且我在 inside 设置速率时Minigun,该getRate()方法仍然从类返回常量Weapon,即使它是在Minigun类上调用的。我认为它会像Java一样,继承的方法将使用内部修改的变量Minigun。目前我必须做以下事情;
武器.h
#ifndef __WEAPON__
#define __WEAPON__
class Weapon
{
public:
virtual int getRate()
{
return rate;
}
private:
const static int rate = 0;
};
#endif
Run Code Online (Sandbox Code Playgroud)
迷你枪.h
#include "Weapon.h"
#ifndef __WEAPON_MINIGUN__
#define __WEAPON_MINIGUN__
class Minigun: public Weapon
{
public: …Run Code Online (Sandbox Code Playgroud) 考虑以下场景:
代码:1
public class StaticDemo {
static{
b=5;
System.out.println("Static B:"+b);/*Compilation error:"Cannot reference a field before it is defined"*/
}
static int b;
static{
System.out.println("B:"+b);
}
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
注释下面的代码,没有错误,并且显示了以下输出.
代码:2
public class StaticDemo {
static{
b=5;
//System.out.println("Static B:"+b);
}
static int b;
static{
System.out.println("B:"+b);
}
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
输出 -
B:5
Run Code Online (Sandbox Code Playgroud)
如果执行基于静态变量或块的写入顺序.
为什么初始化(b=5)没有抛出编译错误,如代码所示:2.
并且还请解释为什么Code:1抛出错误,如果Code:2为真?
可以说我有这样的功能:
void processElement() {
doSomething(someArray[lastProcessedElement + 1]);
}
Run Code Online (Sandbox Code Playgroud)
问题是,每次调用此函数时,我都需要存储我调用doSomething的最后一个元素.所以在这里我有两个选择:
我可以创建一个名为lastProcessedElement的私有类变量,并在每次调用该函数时递增它的值.这种方法似乎最常见.所以代码可以是这样的:
class Foo {
int lastProcessedElement = 0;
public:
void processElement() {
doSomething(someArray[++lastProcessedElement]);
}
}
Run Code Online (Sandbox Code Playgroud)作为第二个选项,我可以在函数中创建一个静态变量并每次递增它:
// Class is not important here, so the function is:
void processElement() {
static int lastProcessedElement = 0;
doSomething(someArray[++lastProcessedElement]);
}
Run Code Online (Sandbox Code Playgroud)第一个解决方案增加了一些我不想要的复杂性.我喜欢把东西放在原地.
我知道第二个解决方案只有在该类只有一个实例时才有效.
那么使用静态变量法是一个很好的解决方案?是否有多实例类的在线解决方案?(可以有一个解决这个特定的数组元素索引的东西,但我刚刚做了,我说的是为函数的下一次调用存储一些值)
覆盖派生类中的静态字段会导致
错误TS2417:构建:类静态端'typeof TDerived'错误地扩展了基类静态端'typeof TBase'.
这是一个合法的错误案例吗?
class TBase
{
private static s_field = 'something';
public constructor() {}
}
class TDerived extends TBase
{
private static s_field = 'something else'; // commenting this line fixes error
public constructor()
{
super();
}
}
Run Code Online (Sandbox Code Playgroud)
那我该怎么处理静态字段呢?现在唯一的解决方法是将类名添加到每个静态字段名称,这是一个非常难看的解决方案.
private static TBase_s_field = 'something';
...
private static TDerived_s_field = 'something else';
Run Code Online (Sandbox Code Playgroud)
ps使用typescript 2.0.3
从C++ 17开始,我一直在尝试更简单的方法来获取类静态变量.我正在写一个仅限标题的库.显然inline,变量的新含义适用于此.
class thingy {
static inline reporter rep;
};
Run Code Online (Sandbox Code Playgroud)
但我一直在收到运行时错误.
我正在使用Visual Studio 15.6.4
要测试,以下内容:
thingy 有一个静态成员变量foo.h中
#pragma once
#include <iostream>
using namespace std;
struct reporter {
reporter() {
cout << "reporter() - " << this << endl;
}
~reporter() {
cout << "~reporter() - " << this << endl;
}
};
class thingy {
static inline reporter rep;
};
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "foo.h"
int main() {}
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中
#include "foo.h"
Run Code Online (Sandbox Code Playgroud)
最令人失望的是,它打印出来:
reporter() - 00007FF670E47C80
reporter() …Run Code Online (Sandbox Code Playgroud) 我在伴生对象中声明了一个字段,因此它将在伴生对象中的函数中知道。
像这样:
class ProgramStructure {
companion object {
var index = 0
fun inc(){
index++
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但是当我调试它时,我看不到“索引”的值。我怎样才能看到价值?
谢谢
static-variables ×10
c++ ×4
c ×2
inheritance ×2
c# ×1
c++17 ×1
constants ×1
debugging ×1
declaration ×1
java ×1
kotlin ×1
methods ×1
php ×1
scope ×1
static ×1
static-block ×1
typescript ×1
visual-c++ ×1
wrapper ×1
xna ×1