我正在使用 Qt 5.9 编写一个应用程序,顶部是 C++ main 和 QML UI。一切正常(包括从 C++ 向 QML 发送信号)但是当我添加ChartView到 UI 时,我看到了崩溃。的精简版ChartView如下所示;当我从代码中省略它时,没有崩溃。
ChartView {
id: _chartView
LineSeries {
name: "avgZ"
XYPoint { x: 0; y: 0}
}
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪(通过优秀的向后cpp):
Stack trace (most recent call last):
#27 Object "", at 0xffffffffffffffff, in
#26 Object "/home/eudoxos/pw/carxx/build/main-qt", at 0x561cceac54a9, in _start
#25 Source "/build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c", line 310, in __libc_start_main [0x7fafdf218b96]
#24 Object "/home/eudoxos/pw/carxx/build/main-qt", at 0x561cceac849b, in main
#23 Object "/usr/lib/x86_64-linux-gnu/libQt5Qml.so.5", at 0x7fafe297761c, in QQmlApplicationEngine::load(QUrl …Run Code Online (Sandbox Code Playgroud) 我有一个类LabelMapper(一个boost::python类),它实现了字典协议.我想有一个代理类,它将使用属性来访问该dicionary.我已经看过许多重写的帖子__setitem__,__getitem__但我似乎无法做到正确.
天真的方法(下面)导致无限递归,因为self.mapper调用LabelMapperProxy.__getattr__,反过来需要self.mapper等等.
class LabelMapper(object):
def __init__(self): self.map={}
def __getitem__(self,key): return self.map[key]
def __setitem__(self,key,val): self.map[key]=val
def __delitem__(self,key): del self.map[key]
class LabelMapperProxy(object):
def __init__(self,mapper): self.mapper=mapper
def __getattr__(self,key): return self.mapper[key]
def __setattr__(self,key,val): self.mapper[key]=val
def __delattr__(self,key): del self.mapper[key]
lm=LabelMapper()
lm['foo']=123
# construct the proxy
lmp=LabelMapperProxy(mapper=lm)
print lmp.foo # !!! recursion
lmp.bar=456
print lmp.bar,lm['bar']
Run Code Online (Sandbox Code Playgroud)
解决办法是什么?也许在标准库中预先煮好这样的代理?
我有一个函数来计算在邻居点集上定义的不同变量的梯度.算法总是相同的,但是根据计算的内容,访问邻居的不同成员数据,例如,当计算速度梯度时,使用Node::velocity,当计算应力梯度时,使用Node::stress.避免多次编写相同函数的最佳方法是什么?
我有几种可能性:
传递lambda函数(c ++ 0x)或可调用对象返回有问题的特定成员数据,称为like
gradVelocity=computeGradient(listOfNeighbors,[](const Node& n){ return n.velocity; });
Run Code Online (Sandbox Code Playgroud)
减号是每次读取时的额外函数调用.
模板基于整数的函数说明正在计算的内容:
enum{VAL_VELOCITY=0,VAL_STRESS,VAL_SOMETHING};
template<int what> computeGradient(const std::list<Node>& neighbors){
/*loop over neighbors*/
value=(what==VAL_VELOCITY?neighbor.velocity:((what==VAL_STRESS)?neighbor.stress:neighbor.something);
/* and so on */
}
/* called like this */
gradVelocity=computeGradient<VAL_VELOCITY>(neighbors);
Run Code Online (Sandbox Code Playgroud)
它应该可能是有效的(希望编译器将在单个实例化中使用常量优化条件),但可读性和可维护性相当低.
一些更好的主意?
我想Base从班级本身之外以不合格的方式(为什么?宏魔法)访问班级成员。策略是在Derived类中执行并将指向指针转换Base为指向指针Derived(即使实例不是a Derived)。
就我尝试而言,代码编译并正确运行:这是标准还是意外(标准是UB)?链接
#include<iostream>
struct Base{
int a=3;
};
struct Derived: public Base{
int getA(){
// this scope has unqualified access to Base class members
return a;
}
};
int main(void){
Base b;
std::cerr<<((Derived*)(&b))->getA()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud) 我使用模板化的游标来为几个类定义统一的接口.为了定义__str__和__repr__方法,我想以编程方式"X"从boost::python::class对象中获取类名(在引用文档中).那可能吗?
通过将类名作为参数传递给访问者的构造函数,可以很容易地处理它,但自动拥有它会更优雅.