当我在VS 2008中编写这样的代码时:
.h
struct Patterns {
string ptCreate;
string ptDelete;
string ptDrop;
string ptUpdate;
string ptInsert;
string ptSelect;
};
class QueryValidate {
string query;
string pattern;
static Patterns pts;
public:
friend class Query;
QueryValidate(const string& qr, const string& ptn):
query(qr), pattern(ptn) {}
bool validate() {
boost::regex rg(pattern);
return boost::regex_match(query, rg);
}
virtual ~QueryValidate() {}
};
Run Code Online (Sandbox Code Playgroud)
然后我像这样初始化我的结构:
.cpp
string QueryValidate::pts::ptCreate = "something";
string QueryValidate::pts::ptDelete = "something";
//...
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误:
'Patterns':'::'左边的符号必须是'ptSelect'类型:不是'QueryValidate'的成员
我究竟做错了什么?这是Visual Studio或我的代码的问题吗?我知道除了const之外的静态成员必须在声明它们的类之外定义.
我遇到了一个像这样设置的类:
public class MyClass {
private static boolean started = false;
private MyClass(){
}
public static void doSomething(){
if(started){
return;
}
started = true;
//code below that is only supposed to run
//run if not started
}
}
Run Code Online (Sandbox Code Playgroud)
我对静态方法的理解是你不应该在它们中使用类变量,除非它们是常量,并且不要改变.相反,你应该使用参数.我的问题是,为什么通过执行MyClass.doSomething()多次调用时不会破坏.在我看来,它应该不起作用,但确实如此.它只会传递一次if语句.
所以任何人都可以向我解释为什么这不会破坏?
好的......在Objective C中,您可以使用'new this()'从基类中的静态方法创建子类,因为在静态方法中,'this'指的是类,而不是实例.当我第一次发现它并且我经常使用它时,这是一个非常酷的发现.
但是,在C#中不起作用.该死的!
那么......任何人都知道如何在静态基类方法中"新建"一个子类?
像这样......
public class MyBaseClass{
string name;
public static Object GimmeOne(string name){
// What would I replace 'this' with in C#?
return new this(name);
}
public MyBaseClass(string name){
this.name = name;
}
}
// No need to write redundant constructors
public class SubClass1 : MyBaseClass{ }
public class SubClass2 : MyBaseClass{ }
public class SubClass3 : MyBaseClass{ }
SubClass1 foo = SubClass1.GimmeOne("I am Foo");
Run Code Online (Sandbox Code Playgroud)
是的,我知道我可以(并且通常会)直接使用构造函数,但我们特别需要在基类上调用共享成员,这就是我要问的原因.再一次,Objective C让我这样做.希望C#也这样做.
所以...任何接受者?
我希望将HashMap作为新类的每个实例的静态成员.然而,每当我尝试.get或输入我的HashMap时,我都会得到一个NullPointerException.救命!?
我正在做:public class EmailAccount {
private static HashMap<String,Integer> name_list;然后name_list.put(last_name, occurences);Even name_list.containsKey(last_name);返回NullPointer.
这来自于之前的一个问题:计算Java中字符串的出现次数
考虑以下课程
class Foo
{
typedef bool (*filter_function)(Tree* node, std::list<std::string>& arg);
void filter(int filter, std::list<std::string>& args)
{
...
if (filter & FILTER_BY_EVENTS) {
do_filter(events_filter, args, false, filter & FILTER_NEGATION);
}
...
}
void do_filter(filter_function ff, std::list<std::string>& arg,
bool mark = false, bool negation = false, Tree* root = NULL)
{
...
}
bool events_filter(Tree* node, std::list<std::string>& arg)
{
...
}
};
Run Code Online (Sandbox Code Playgroud)
我可以events_filter作为参数传递给do_filter唯一events_filter的static成员.但我不想成功static.有没有办法可以将指向成员函数的指针传递给另一个函数?可能正在使用boost库(如函数)左右.
谢谢.
我的问题实际上是关于如何解决C#初始化静态字段的方法.在尝试复制Java样式枚举时,我需要这样做.以下是显示问题的代码示例:
我继承的所有枚举的基类
public class EnumBase
{
private int _val;
private string _description;
protected static Dictionary<int, EnumBase> ValueMap = new Dictionary<int, EnumBase>();
public EnumBase(int v, string desc)
{
_description = desc;
_val = v;
ValueMap.Add(_val, this);
}
public static EnumBase ValueOf(int i)
{
return ValueMap[i];
}
public static IEnumerable<EnumBase> Values { get { return ValueMap.Values; } }
public override string ToString()
{
return string.Format("MyEnum({0})", _val);
}
}
Run Code Online (Sandbox Code Playgroud)
枚举集的示例:
public sealed class Colors : EnumBase
{
public static readonly Colors Red = …Run Code Online (Sandbox Code Playgroud) 除了可怕之外,如果我有一个.NET webapp,其中静态变量分散在多个类中,那么最好的方法是将它们全部"清除"为null.
在我的头顶,它将是使用重新启动应用程序
System.Web.HttpRuntime.UnloadAppDomain()
Run Code Online (Sandbox Code Playgroud)
问题背后的原因 - 我们正在缓存一些非常大的字典集合,这些集合的创建成本很高,并且在奇怪的情况下需要重置.
可能重复:
访问静态成员变量
我有一个符号inst,它是一个类的对象classy.我需要通过对象的符号访问此类的静态成员.我试过inst::staticmember但我的g ++说error: ‘inst’ is not a class or namespace.
我怎样才能做到这一点?
我在初始化静态成员对象时遇到了一些问题.在我的项目中有3个类文件:
Feat,Class(RPG风格不是c#类),和Race.
他们每个人都有其可通过例如访问的一些静态成员对象Feat.General.MightyBlow,Race.Dwarf或Class.Base.Warrior同时MightyBlow.GetType()- > Feat,Dwarf.GetType()- > Race和Warrior.GetType()- > Class.一项壮举可以依赖于其他专长,课程和比赛,同样适用于课程和比赛.这三个类别中的每一个都不是由真正的类/专长/种族引用,而是通过名称字符串引用,该字符串可以在字典中查找,如:Class someClass = Class.Implemented[someClassesName].
一些最小的例子:
public static Feat ArmorHeavy = new Feat(
"ArmorHeavy",
Req.Feats(ArmorLight.GetName),
);
public static Feat ArmorLight = new Feat(
"ArmorLight",
Req.Feats(),
);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,首先需要的是ArmorHeavy需求ArmorLight,并且该需求仅通过ArmorLight名称(简称字符串"ArmorLight")来标识.
我没有编译器错误,但运行时我得到以下错误
NullReferenceException:对象引用未设置为对象的实例Feat + Proficiency..cctor()
我认为在ArmorHeavyC#的初始化过程中到达了这个点,在那里ArmorLight.GetName被调用,现在跳转到初始化ArmorLight并ArmorHeavy在ArmorLight初始化之后完成.情况并非如此,因为如果我交换这两个成员对象的位置或删除要求,则不会出现错误.
我怎么解决这个问题?请不要告诉我,我必须相应地订购所有专长.
静态公共类中的静态公共变量如何在C#MVC3 Web项目中的Web请求之间表现.这些类型的变量是否在请求之间保留了值?
static-members ×10
c# ×5
c++ ×3
java ×2
asp.net ×1
class ×1
constructor ×1
definition ×1
enumeration ×1
hashmap ×1
objective-c ×1
static ×1
subclass ×1