静态成员是单独存储的,不是对象的组成部分。
静态成员变量
不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存。1
2
3
4
5
6class StringBad
{
private:
static int num_strings;
...
};
静态成员变量是在方法文件中进行初始化,若刚在头文件中初始化会造成多个初始化语句引发错误。
静态成员是单独存储的,不是对象的组成部分。
不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存。1
2
3
4
5
6class StringBad
{
private:
static int num_strings;
...
};
静态成员变量是在方法文件中进行初始化,若刚在头文件中初始化会造成多个初始化语句引发错误。
C++编译器会自动生成几个成员函数,这里属于接触到的新东西,而且如果不了解C++编译器的这种机制,在很多时候会因为隐式的调用这几个特殊的成员函数而导致程序发生错误。
特殊成员函数
友元函数与普通的非成员函数不同,它可以访问类的私有成员。
.
来调用看到上面第二条我天真的理解成了,在友元函数定义中也可以向成员函数那样直接使用类中的变量呢,结果编译器就啪啪啪的打了我的脸。
我在一个<<
运算符重载友元函数中这样使用的类变量:1
2
3
4
5
6
7
8
9
10// friend functions
std::ostream & operator<<(std::ostream & os, const Stonewt & st)
{
if(st.status == STN)
std::cout << st.stone << " stone, " << st.pds_left << "pounds";
else if(st.status == PDS)
std::cout << st.pounds << " pounds";
else
std::cout << "Incorrect status";
}
今天又碰到了个新问题,先上代码:
vect.cpp1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16...
// private methods
// calculates magnitude from x and y
double Vector::get_mag(double a, double b)
{
return sqrt(a * a + b * b);
}
double Vector::get_ang(double a, double b)
{
if (a == 0.0 && b == 0.0)
return 0.0;
else
return atan2(b, a);
}
...
昨晚写《C++ Primer Plus》第十章第六题的时候遇到了一个熟悉又陌生的error1
call of overloaded Move::Move() is ambiguous
这个词应该是编译器发现在重载的时候程序中有二义性,我仔细看了下我写的程序,发现我在含有参数的构造函数的原型中添加了默认参数:1
2
3
4
5
6
7
8
9
10
11Move::Move(double a = 0, double b = 0)
{
x = a;
y = b;
}
Move::Move()
{
x = 0.0;
y = 0.0;
}
当调用Move::Move()
的时候编译器会匹配最匹配的函数,因为默认参数的存在,使得函数原型Move::Move(double a = 0, double b = 0)
和Move::Move()
都可以匹配,因此编译器就报错了,因为有了二义性。
关于连续计算这里其实是很早以前就加进来的功能,但是由于这里也算是一个比较重要而且比较复杂的更新,在这里记一下以免自己忘记。
这部分比较难处理的是关于连续作业的起始时间start_time
和起始步数start_step
的设定。然后再KMCAnalysisPlugin
类(或者子类)中将新的KMC循环的time和step进行相应的“平移处理”。
这里我写了个装饰器来处理,对KMCAnalysisPlugin
的setup()
方法进行装饰,使其能够在进行on-the-fly分析的时候能够先把time和step处理完毕。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19def reset_step_and_time(func):
'''
Decorator function to decorate analysis plugin methods.
'''
def wrapped_func(self, step, time, configuration):
step = step + self.step_base
time = time + self.time_base
func(self, step, time, configuration)
return wrapped_func
...
class KynetixPlugin(KMCAnalysisPlugin):
...
def setup(self, step, time, configuration):
...