在MVVM体系结构中设置控制焦点的一个好习惯是什么? 我设想的方式是在ViewModel上有一个属性,在需要时触发焦点更改。 而且,UI控件绑定/侦听该属性,以便如果更改,将设置适当的焦点。 我把它看作是一个ViewModel的东西,因为我想在ViewModel执行某个动作之后设置合适的焦点,比如加载某些数据。 最佳做法是什么?
我浪费了无数个小时来查明gcc的问题。 我想用另外一个编译器来testing我们的代码库,以寻找更多的Clang可能错过的警告。 我感到震惊的是,由于模板论证扣除的失败,几乎有一半的项目停止编译。 在这里,我试图把我的情况弄到最简单的一段代码。 #include <type_traits> struct Foo { }; // This is a template function declaration, where second template argument declared without a default template <typename T, typename> void foo(const Foo & foo, T t); // This is a template function definition; second template argument now has a default declared template <typename T, typename […]
C ++编译器自动生成拷贝构造函数和拷贝赋值操作符。 为什么不swap呢? 现在,实现复制赋值运算符的首选方法是复制和交换方式: T& operator=(const T& other) { T copy(other); swap(copy); return *this; } ( 忽略使用按值传递的复制易用表单 )。 这个习惯用法的优点是在exception情况下是事务性的(假设swap实现不会抛出)。 相比之下,默认的编译器生成的复制赋值操作符recursion地对所有基类和数据成员进行复制赋值,并且不具有相同的exception安全保证。 同时,手动实现swap方法是很繁琐和容易出错的: 为了确保swap不会丢失,必须为所有非POD成员在类和基类中,在非POD成员中执行。 如果一个维护者向类中添加一个新的数据成员,维护者必须记得修改该类的swap方法。 如果不这样做可能会引入微妙的错误。 另外,因为swap是一个普通的方法,所以如果swap实现不完整,编译器(至less我不知道的)不会发出警告。 如果编译器自动生成swap方法不是更好吗? 然后隐式复制分配实现可以利用它。 显而易见的答案可能是:当开发C ++时,copy-and-swap成语不存在,现在这样做可能会破坏现有的代码。 不过,也许人们可以select让编译器使用C ++ 0x用于控制其他隐式函数的相同语法来生成swap : void swap() = default; 然后可能会有规则: 如果存在编译器生成的swap方法,则可以使用“复制和交换”来实现隐式复制分配操作符。 如果没有编译器生成的swap方法,将像以前一样实现隐式的复制分配操作符(在所有基类和所有成员上调用复制分配)。 有谁知道C ++标准委员会是否已经提出了这样的(疯狂的)事情,如果有的话,委员会成员有什么意见?
我可以通过迭代器(如vector )在c ++中遍历标准的priority_queue或标准queue吗? 我不想使用popup,因为它导致我的队列出列。 谢谢你的帮助
我使用gcc的-fno-rtti标志来编译我的C ++,没有运行时types信息。 假设我没有使用dynamic_cast<>或typeid() ,有什么可能导致我以后的问题?
我碰巧注意到,在C ++中,用std rand()方法调用的第一个随机数大部分时间比第二个随机数小得多。 关于Qt的实现,第一个几乎总是小几个数量级。 qsrand(QTime::currentTime().msec()); qDebug() << "qt1: " << qrand(); qDebug() << "qt2: " << qrand(); srand((unsigned int) time(0)); std::cout << "std1: " << rand() << std::endl; std::cout << "std2: " << rand() << std::endl; 输出: qt1: 7109361 qt2: 1375429742 std1: 871649082 std2: 1820164987 这是打算,由于错误播种或错误? 同样,当qrand()输出强烈变化时,第一个rand()输出似乎随时间线性变化。 只是想知道为什么
我不断地得到相同的问题,我想要引用的对象被复制或我想要复制的对象被引用的地方。 当我使用=运算符时会发生这种情况。 例如,如果我将对象发送给另一个表单,即: SomeForm myForm = new SomeForm(); SomeObject myObject = new SomeObject(); myForm.formObject = myObject; …然后修改表单中的对象,原始对象不会被修改。 就好像该对象被复制并且没有被引用。 然而,当我这样做时: SomeObject myObject = new SomeObject(); SomeObject anotherObject = new SomeObject(); anotherObject = myObject; …然后修改anotherObject , myObject也会被修改。 最令人烦恼的情况是,当我尝试克隆我定义的对象之一: public class SomeObject { double value1, value2; //default constructor here public SomeObject(val1, val2) { value1 = val1; value2 = […]
所以我有这个代码: uint32_t s1 = 0xFFFFFFFFU; uint32_t s2 = 0xFFFFFFFFU; uint32_t v; … v = s1 * s2; /* Only need the low 32 bits of the result */ 在所有的下面,我假设编译器不能对s1或s2的范围有任何的先入之见,初始值设定项仅用于上面的一个例子。 如果我在一个整数大小为32位的编译器(例如编译x86时)上编译这个,没问题。 编译器会简单地使用s1和s2作为uint32_ttypes的值(不能进一步提升它们),乘法只会给出结果,如注释所示(模UINT_MAX + 1 ,这是0x100000000这种情况)。 但是,如果我编译这个整数大小为64位的编译器(如x86-64),可能会有一些未定义的行为,我可以从C标准中推断出来。 整数提升会看到uint32_t可以被提升为int (64位有符号),然后乘法会试图乘以两个int ,如果碰巧有例子中显示的值,会导致整数溢出,这就是未定义的行为。 我纠正这一点,如果是的话,你会如何避免它以一种理智的方式? 我发现了这个类似的问题,但涵盖了C ++: 安全地模块化乘无符号整数的最佳C ++方法是什么? 。 在这里我想得到一个适用于C的答案(最好是C89兼容)。 尽pipe(通常在代码中,这是值得关注的,32位性能可能更为重要,因为通常那些是较慢的机器),所以我不会考虑制作一台可怜的32位机器,可能会执行一个64位乘法的可接受答案。 请注意,使用32位int大小的编译器编译时,同样的问题可以应用于16位无符号整数,编译时使用16位int大小的编译器编译无符号字符(后者可能与8位CPU的编译器相同:C标准要求整数至less为16位,所以符合的编译器可能会受到影响)。
我一直在教C ++编程类多年,向学生解释的一个最棘手的问题是const重载。 我通常使用向量类的例子和它的operator[]函数: template <typename T> class Vector { public: T& operator[] (size_t index); const T& operator[] (size_t index) const; }; 我很难解释为什么需要两个版本的operator[]函数,但是在试图解释如何将两个实现结合在一起时,我经常发现自己浪费了大量的语言arcana。 问题是,我知道如何以另一种方式实现这些函数之一的唯一好的,可靠的方法是使用const_cast / static_cast技巧: template <typename T> const T& Vector<T>::operator[] (size_t index) const { /* … your implementation here … */ } template <typename T> T& Vector<T>::operator[] (size_t index) { return const_cast<T&>(static_cast<const Vector&>(*this)[index]); } […]
我有一个帮助function,把分钟变成小时/分钟。 我目前在我的layout.cshtml中,但每页都看不到该function。 我应该在哪里放置助手function,使每个页面都可以看到? @helper DisplayElapsedTime(int timeInMins){ String timeStr = ""; if (timeInMins >= 60) { int hours = timeInMins/60; timeInMins -= hours * 60; timeStr = hours + "h "; } if (timeInMins > 0){ timeStr += timeInMins + "m"; } @timeStr; }