相关疑难解决方法(0)

C++中的静态构造函数?我需要初始化私有静态对象

我想要一个具有私有静态数据成员的类(包含所有字符az的向量).在java或C#中,我可以创建一个"静态构造函数",它将在我创建类的任何实例之前运行,并设置类的静态数据成员.它只运行一次(因为变量是只读的,只需要设置一次),因为它是类的一个函数,它可以访问它的私有成员.我可以在构造函数中添加代码来检查向量是否已初始化,如果不是,则初始化它,但是这会引入许多必要的检查,并且似乎不是问题的最佳解决方案.

我想到,因为变量只是只读的,所以它们只能是公共的静态const,所以我可以在类外面设置它们,但是再一次,它看起来有点像丑陋的黑客.

如果我不想在实例构造函数中初始化它们,是否可以在类中拥有私有静态数据成员?

c++ static private static-constructor initializer

172
推荐指数
8
解决办法
15万
查看次数

成员函数中的静态变量

有人可以解释成员函数中的静态变量如何在C++中工作.

鉴于以下课程:

class A {
   void foo() {
      static int i;
      i++;
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我声明了多个实例A,那么调用foo()一个实例会增加i所有实例上的静态变量吗?或者只是它被召唤的那个?

我假设每个实例都有自己的副本i,但是通过一些代码,我似乎另有说明.

c++ static scope

151
推荐指数
3
解决办法
8万
查看次数

在C++中使用HashMap的最佳方法是什么?

我知道STL有一个HashMap API,但我找不到任何好的和全面的文档,并提供了很好的例子.

任何好的例子将不胜感激.

c++ hashmap

149
推荐指数
4
解决办法
31万
查看次数

C/C++:切换非整数

通常我需要根据非POD常量元素的值选择要做的事情,如下所示:

switch( str ) {
  case "foo": ...
  case "bar": ...
  default:    ...
}
Run Code Online (Sandbox Code Playgroud)

可悲的是switch只能用整数:error: switch quantity not an integer.

实现这样的事情最简单的方法是获得一系列ifs:

if( str == "foo" )      ...
else if( str == "bar" ) ...
else                    ...
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案看起来很脏并且应该花费O(n),其中n是案例数,而在最坏的情况下,使用二进制搜索,这段代码可能花费O(log n).

使用一些数据结构(如Maps)可以获得表示字符串的整数(O(log n)),然后使用O(1)switch,或者可以通过if在右边嵌套s 来实现静态二进制排序但是,这些黑客攻击还需要大量编码,使一切变得更加复杂和难以维护.

最好的方法是什么?(快速,干净,简单,正如switch声明所述)

c c++ switch-statement

53
推荐指数
5
解决办法
3万
查看次数

使用C++中的开关评估字符串

我想用开关评估一个字符串但是当我读取用户输入的字符串时会抛出以下错误.

#include<iostream>
using namespace std;

    int main() {
        string a;
        cin>>a;
        switch (string(a)) {
        case "Option 1":
            cout<<"It pressed number 1"<<endl;
            break;
        case "Option 2":
            cout<<"It pressed number 2"<<endl;
            break;
        case "Option 3":
            cout<<"It pressed number 3"<<endl;
            break;
        default:
            cout<<"She put no choice"<<endl;
            break;
        }
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

错误:从类型'std :: string {aka std :: basic_string}'无效转换为类型'int

c++

47
推荐指数
4
解决办法
21万
查看次数

带有QString类型的C++中的switch/case语句

我想在我的程序中使用switch-case但编译器会生成错误.我如何使用该switch语句QString

编译器给我这个错误:

switch expression of type 'QString' is illegal
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

bool isStopWord( QString word )
{
bool flag = false ;

switch( word )
{
case "the":
    flag = true ;
    break ;
case "at" :
    flag = true ;
    break ;
case "in" :
    flag = true ;
    break ;
case "your":
    flag = true ;
    break ;
case "near":
    flag = true ;
    break ;
case "all":
    flag = true ;
    break ;
case …
Run Code Online (Sandbox Code Playgroud)

c++ qstring qt qt4 switch-statement

26
推荐指数
4
解决办法
7万
查看次数

如何在C++中通过名称(std :: string)调用函数?

我想知道是否有一种从字符串中调用函数的简单方法.我知道一种简单的方法,使用'if'和'else'.

int function_1(int i, int j) {
    return i*j;
}

int function_2(int i, int j) {
    return i/j;
}

...
...
...

int function_N(int i, int j) {
    return i+j;
}

int main(int argc, char* argv[]) {
    int i = 4, j = 2;
    string function = "function_2";
    cout << callFunction(i, j, function) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是基本方法

int callFunction(int i, int j, string function) {
    if(function == "function_1") {
        return function_1(i, j);
    } else if(function == "function_2") { …
Run Code Online (Sandbox Code Playgroud)

c++ string function invoke code-cleanup

18
推荐指数
3
解决办法
4万
查看次数

案例表达不是恒定的

我在switch语句中得到一个'case expression not constant'错误.但是,标头为使用的常量提供了定义,构造函数在其初始化列表中为它们提供了初始化.

另外,当我将鼠标悬停在"问题"语句上时,它会将它们标识为常量.

const int ThisClass::EXAMPLE_CONSTANT

error expression must have a constant value
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎有点违反直觉.我做了一些研究,发现了其他人的类似问题.他们被告知所有常量实际上必须在'main'中初始化,并且这是语言的限制.这是真的吗?似乎不太可能.

c++

16
推荐指数
2
解决办法
4万
查看次数

在switch语句中使用字符串 - 我们在C++ 17中的立场是什么?

我们每个人(可能)都有童年的写作梦想:

switch(my_std_string) {
case "foo":  do_stuff(); break;
case "bar":  do_other_stuff(); break;
default:     just_give_up();
}
Run Code Online (Sandbox Code Playgroud)

但这是不可能的,正如古代(2009年)对这个问题的答案所解释的那样:

为什么switch语句不能应用于字符串?

从那时起,我们已经看到了C++ 11的出现,它让我们走得更远:

switch (my_hash::hash(my_std_string)) {
case "foo"_hash:  do_stuff(); break;
case "bar"_hash:  do_other_stuff(); break;
default:          just_give_up();
}
Run Code Online (Sandbox Code Playgroud)

如在描述答案编译时间字符串哈希 -这是没有那么糟糕,但它实际上并没有做正是我们想要的-有碰撞的机会.

我的问题是:从那时起语言的发展(我认为主要是C++ 14)是否影响了编写一个字符串case语句的方式?或简化实现上述目的的螺母和螺栓?

具体而言,与结束C++ 17标准之中指日可待 -我很感兴趣,鉴于我们可以假设标准将包含答案.

注意:这不是关于使用switch语句的优点的讨论,也不是关于meta的线程的讨论.我问的是一个内容丰富的问题​​,所以请在此基础上回答/ up/downvote.

c++ stdstring string-literals switch-statement c++17

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

将源代码翻译成外语

我正在运行一个教育网站,教孩子们(12-15岁).

因为他们并不都在解决方案的代码源中说英语,所以我们使用法语变量和函数名称.但是,我们计划将内容翻译成其他语言(德语,西班牙语,英语).为此,我想尽快翻译源代码.我们大多数都有C/C++代码.

我打算使用的解决方案:

  1. 从源代码中提取所有变量/函数名称,以及它们在文件中的位置(声明,使用,调用它们的位置......)
  2. 删除所有语言关键字和库函数
  3. 请翻译人员提供其余名称的翻译
  4. 替换文件中的名称

是否已经有一些开源代码/项目可以做到这一点?(对于第1,2和4点)

如果没有,那么第一个中最困难的一点是:使用C/C++解析器构建一个语法树然后用它们的位置提取变量似乎是要走的路.你有其他想法吗?

谢谢你的任何建议.

编辑: 如评论中所述,我还需要处理注释,但只有少数几个:完整的解决方案已经用纯文本解释,然后我们用自解释的变量显示代码源/函数名称.源代码很少超过30/40行,如果您已经知道代码在做什么,那么好的名称必须使它在没有注释的情况下可以理解.

附加信息:对于感兴趣的人来说,网站是国际奥林匹克信息学和C/C++的培训平台(至少是编程竞赛所需的最低限度),12岁时学习并不困难.

c c++ localization

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