小编kin*_*nak的帖子

210
推荐指数
5
解决办法
79万
查看次数

如何在一组数字上找到GCD,LCM

在一组数字上计算最大公约数和最小公倍数的最简单方法是什么?可以使用哪些数学函数来查找此信息?

java math lcm greatest-common-divisor

62
推荐指数
4
解决办法
13万
查看次数

构建器模式:确保对象完全构建

例如,如果我有一个构建器,那么我可以像这样创建对象:

Node node = NodeBuilder()
            .withName(someName)
            .withDescription(someDesc)
            .withData(someData)
            .build();
Run Code Online (Sandbox Code Playgroud)

如何确保在构建方法之前已经设置了用于构建对象的所有变量?

例如:

Node node = NodeBuilder()
            .withName(someName)
            .build();
Run Code Online (Sandbox Code Playgroud)

不是一个有用的节点,因为尚未设置描述和数据.

我使用构建器模式的原因是因为没有它,我需要很多构造函数的组合.例如,可以通过获取Field对象来设置名称和描述,并且可以使用文件名设置数据:

Node node = NodeBuilder()
            .withField(someField) //Sets name and description 
            .withData(someData) //or withFile(filename)
            .build(); //can be built as all variables are set
Run Code Online (Sandbox Code Playgroud)

否则将需要4个构造函数(字段,数据),(字段,文件名),(名称,描述,数据),(名称,描述,文件名).当需要更多参数时会变得更糟.

这些"方便"方法的原因是因为必须构建多个节点,因此它可以节省大量重复的行,如:

Node(modelField.name, modelField.description, Data(modelFile)),
Node(dateField.name, dateField.description, Data(dateFile)),
//etc
Run Code Online (Sandbox Code Playgroud)

但是在某些情况下,需要使用非来自文件的数据构建节点,和/或名称和描述不基于字段.也可能有多个节点共享相同的值,因此不是:

Node(modelField, modelFilename, AlignLeft),
Node(dateField, someData, AlignLeft),
//Node(..., AlignLeft) etc
Run Code Online (Sandbox Code Playgroud)

你可以有:

LeftNode = NodeBuilder().with(AlignLeft);

LeftNode.withField(modelField).withFile(modelFilename).build(),
LeftNode.withField(dateField).withData(someData).build()
Run Code Online (Sandbox Code Playgroud)

所以我认为我的需求与构建器模式非常匹配,除了构建不完整对象的能力.由于上述原因,"在构造函数中放置必需参数并具有可选参数的构建器方法"的正常建议不适用于此处.

实际问题:如何在编译时调用构建之前确保已设置所有参数?我正在使用C++ 11.

(在运行时,我可以为每个参数设置一个标志位,并声明所有标志都在构建中设置)

或者是否有一些其他模式来处理大量的构造函数组合?

c++ builder builder-pattern c++11

13
推荐指数
2
解决办法
961
查看次数

是否允许使用不同的类型替换`this`?

在这个问题的评论和答案中: 虚函数编译器优化c ++ 认为循环中的虚函数调用不能被虚拟化,因为虚函数可能this被另一个使用placement new的对象替换,例如:

void A::foo() { // virtual 
   static_assert(sizeof(A) == sizeof(Derived)); 
   new(this) Derived; 
}
Run Code Online (Sandbox Code Playgroud)

该示例来自LLVM博客关于虚拟化的文章

现在我的问题是:标准允许的是什么?

我可以在关于存储重用的cppreference上找到这个:(强调我的)

如果对象是可以破坏的,或者如果程序不依赖于析构函数的副作用,则不需要程序调用对象的析构函数来结束其生命周期.但是,如果一个程序结束了一个非平凡对象的生命周期,它必须确保在隐式调用析构函数之前就地构造一个相同类型的新对象(例如,通过放置new).

如果新对象必须具有相同的类型,则它必须具有相同的虚函数.因此,不可能有不同的虚函数,因此,虚拟化是可以接受的.

或者我误解了什么?

c++ language-lawyer

13
推荐指数
2
解决办法
231
查看次数

我是否可以在使用C++构建静态本地时访问它?

保证在C++标准首次使用时实例化静态本地.但是,我想知道如果我在构建时访问静态本地对象会发生什么.我认为这是UB.但在以下情况下避免这种情况的最佳做法是什么?

一个问题的情况

Meyers Singleton模式在静态getInstance()方法中使用静态局部来在第一次使用时构造对象.现在,如果构造函数(直接或indireclty)getInstance()再次调用,我们将面临静态初始化尚未完成的情况.这是一个最小的例子,它说明了问题情况:

class StaticLocal {
private:
    StaticLocal() {
        // Indirectly calls getInstance()
        parseConfig();
    }
    StaticLocal(const StaticLocal&) = delete;
    StaticLocal &operator=(const StaticLocal &) = delete;

    void parseConfig() {
        int d = StaticLocal::getInstance()->getData();
    }
    int getData() {
        return 1;
    }

public:
    static StaticLocal *getInstance() {
        static StaticLocal inst_;
        return &inst_;
    }

    void doIt() {};
};

int main()
{
    StaticLocal::getInstance()->doIt();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在VS2010中,这没有问题,但VS2015死锁.

对于这种简单,减少的情况,显而易见的解决方案是直接呼叫getData(),而无需getInstance()再次呼叫.但是,在更复杂的情况下(根据我的实际情况),这种解决方案是不可行的.

尝试解决方案

如果我们改变getInstance()方法来处理像这样的静态局部指针(从而放弃Meyers Singleton模式):

static StaticLocal …
Run Code Online (Sandbox Code Playgroud)

c++ static-initialization visual-studio-2015

11
推荐指数
3
解决办法
871
查看次数

Android Location API:获取提供商状态

获取位置提供商状态的Android中最好的方法是什么?注册LocationListener以进行位置更新时,onStatusChanged(String provider, int status, Bundle extras)只要状态发生更改,就会调用回调.但是,我没有找到获取当前状态(的方式AVAILABLE,OUT_OF_SERVICE,TEMPORARILY_UNAVAILABLE)没有注册到位置更新.该isProviderEnabled方法仅指示提供者是否通常打开(在设备的设置中),因此可能会返回,true尽管提供程序已停止服务...是否有其他方法可以执行此操作?

另一个问题:是否可以在不注册位置更新的情况下监听状态更新?我想听一个特定的提供商的位置,但同时检查其他人是否可用.我目前的解决方法是将最小时间和距离设置为一个非常高的值,但我想知道是否有更好的解决方案......

谢谢你的任何提示!

顺便说一句:如果可能,解决方案应该适用于Android 1.1

android

5
推荐指数
1
解决办法
2573
查看次数

从其他类访问枚举值

在我的项目中,我有一个在类中定义的枚举,在整个类中使用.在重构期间,该枚举被移动到另一个类.所以我只是typedef在我的原始课程中编辑它,如下所示:

class A {
public:
  enum E {e1, e2};
};
class B {
public:
  typedef A::E E;
};
Run Code Online (Sandbox Code Playgroud)

现在变量定义,返回值,函数参数等完美地工作.只有当我想要访问第二个类中的枚举值时,我仍然必须使用surroundig类的名称来限定它们,
例如E e = A::e1;

有没有办法避免这种情况,或者我是否必须将其复制到每个枚举值的出现中?

c++ enums typedef

5
推荐指数
1
解决办法
3494
查看次数

typoscript:根据Page-ID和GET参数构建URL

我必须使用typoscript替换我的typo3页面上的标记来构建到另一个页面的链接(即同一页面的另一种类型).

对于此链接,我必须设置与当前页面相同的查询参数,以及当前页面的页面ID <a href="index.php?id=11&param1=abc&param2=def&type=123">

到目前为止,我将收到的QUERY_STRING传递给以下站点.当前页面的路径没有id参数时会出现问题,例如由RealURL设置.

所以我需要的是这样的映射:

mysite.com/about_us  
     ==>  mysite.com/index.php?id=11&type=123&L=1

mysite.com/index.php?id=33&param1=abc&param2=def&L=1
     ==>  mysite.com/index.php?id=33&param1=abc&param2=def&L=1
Run Code Online (Sandbox Code Playgroud)

这是我试过的:

page.10.marks.printlink = HTML
page.10.marks.printlink.value = dummy
# For plugin pages with querystring
page.10.marks.printlink.value.data= getIndpEnv:QUERY_STRING
# For other Typo3 pages
page.10.marks.printlink.value.ifEmpty.data = page:uid
page.10.marks.printlink.value.ifEmpty.dataWrap = id=|
page.10.marks.printlink.value.wrap = <a target="_blank" href="index.php?|&type=123">print</a>
Run Code Online (Sandbox Code Playgroud)

这适用于大多数情况,但是如果RealURL PREVar就位则不适用,在这种情况下会映射以下内容:

mysite.com/de/über_uns
  ==>  mysite.com/de/index.php?L=2&type=123
Run Code Online (Sandbox Code Playgroud)

所以,没有id传递!(大概是因为RealURL替换了/de/prevar L=2,但没有设置id)

我的问题是:有没有办法简单地连接page:uidQUERY_STRING?或者我是否还要做更多的typoscript魔术?

谢谢你的任何提示!

typo3 typoscript

2
推荐指数
1
解决办法
6785
查看次数

c ++中Common File Dialog和Common Item Dialog的主要区别是什么?

我的问题是:

Common File Dialog和Common Item Dialog之间的主要区别是什么?

MSDN刚才说:

从Windows Vista开始,Common Item Dialog在用于打开或保存文件时会取代旧的Common File Dialog.我们建议您使用Common Item Dialog API而不是Common File Dialog API.

但它没有解释什么是变更日志或它们之间的主要区别?

谢谢你的帮助.

c++ windows

2
推荐指数
1
解决办法
648
查看次数

如何在 QML 中直接在列表中声明项目?

我在 QML 中有一个Dummy对象:

import QtQuicks 2.7
Item { property int foo: 0 }
Run Code Online (Sandbox Code Playgroud)

另一个对象需要创建此类对象的实例列表。但我该如何声明呢?在列表中使用直接 QML 声明不起作用:

import QtQuicks 2.7

Item {
    property var fools: [
        Dummy {foo: 1},
        Dummy {foo: 2},
        Dummy {foo: 3}
    ]
}
Run Code Online (Sandbox Code Playgroud)

我收到错误Cannot assign multiple values to a singular property

如何正确声明假人列表?

qt qml qt5

2
推荐指数
1
解决办法
1155
查看次数

QWidget 旁边的 QTabWidget 选项卡

在 Qt 和 C++ 中,是否可以在 QTabWidget 的选项卡旁边放置 QWidget?

为了澄清我的意思,下图:带有 QTabWidget 的示例程序

这张图中的红色矩形属于QTabWidget,但没有使用,因为所有选项卡都小到不需要它。可以在这里放置另一个 QWidget 吗?

c++ qt

1
推荐指数
1
解决办法
279
查看次数

即使在java中对象的状态相同,equals也给出false

我的代码看起来有点像这样:

public class EqualityTrial {

  public static void main(String[] args) {
    // TODO Auto-generated method stub

    EqualityTrail1 obj1 = new EqualityTrail1();
    obj1.setName("Ankit");
    obj1.setAge(23);
    EqualityTrail1 obj2 = new EqualityTrail1();
    obj2.setName("Ankit");
    obj2.setAge(23);

    if(obj1 == obj2){
        System.out.println("== gave true");
    }else{
        System.out.println("== gave false");
    }
    if(obj1.equals(obj2)){
        System.out.println("equals gave true");
    }else{
        System.out.println("equals gave false");
    }

  }

}
Run Code Online (Sandbox Code Playgroud)

每次条件都是假的.我知道==比较引用是否指向同一个对象,在这种情况下不是那么假是正确的结果但是在'equals'方法的情况下,据我所知它比较两个对象的状态...如果状态同样的方法应该返回true,即使两个对象的状态相同,在这种情况下返回false.我错过了什么吗?

java

0
推荐指数
1
解决办法
1140
查看次数