The best input is OUTPUT.

2016-02-28
关于C++类的静态成员变量

静态成员是单独存储的,不是对象的组成部分。

静态成员变量

不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存。

1
2
3
4
5
6
class StringBad
{
private:
static int num_strings;
...
};

静态成员变量是在方法文件中进行初始化,若刚在头文件中初始化会造成多个初始化语句引发错误。
Read More

2016-02-27
关于C++特殊成员函数

C++编译器会自动生成几个成员函数,这里属于接触到的新东西,而且如果不了解C++编译器的这种机制,在很多时候会因为隐式的调用这几个特殊的成员函数而导致程序发生错误。

特殊成员函数

  • 默认构造函数
  • 默认析构函数
  • 复制构造函数
  • 赋值运算符
  • 地址运算符
Read More

2016-02-26
关于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";
}

Read More

2016-02-25
关于错误passing '...' as 'this' argument of '...' discard qualifiers

今天又碰到了个新问题,先上代码:
vect.cpp

1
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);
}
...

Read More

2016-02-25
关于C++类构造函数的重载

昨晚写《C++ Primer Plus》第十章第六题的时候遇到了一个熟悉又陌生的error

1
call of overloaded Move::Move() is ambiguous

这个词应该是编译器发现在重载的时候程序中有二义性,我仔细看了下我写的程序,发现我在含有参数的构造函数的原型中添加了默认参数:
1
2
3
4
5
6
7
8
9
10
11
Move::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()都可以匹配,因此编译器就报错了,因为有了二义性。
Read More

2016-02-23
Kynetix支持KMC连续计算

关于连续计算这里其实是很早以前就加进来的功能,但是由于这里也算是一个比较重要而且比较复杂的更新,在这里记一下以免自己忘记。

这部分比较难处理的是关于连续作业的起始时间start_time和起始步数start_step的设定。然后再KMCAnalysisPlugin类(或者子类)中将新的KMC循环的time和step进行相应的“平移处理”
这里我写了个装饰器来处理,对KMCAnalysisPluginsetup()方法进行装饰,使其能够在进行on-the-fly分析的时候能够先把time和step处理完毕。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def 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):
...

@reset_step_and_time
def setup(self, step, time, configuration):
...

Read More