小编Sim*_*mon的帖子

存储设置的最佳做法

我有一个相当大的C++应用程序(在Windows上,没有计划其他平台),它目前存储Windows注册表中的所有设置(甚至某种地址).

有时这很不方便,因为用户在更改注册表中的条目时遇到困难.我想设置版本,因此设置始终与当前代码匹配.目前我们对reg-files进行了版本控制,但是如果所有的reg文件都已添加到目标计算机上,那么您永远不会确定.使用C#,您可以在app.config中定义默认值,但不要覆盖现有设置.我不知道,如果C++存在这样的机制或库.

我想拥有以下"功能":

  • 设置可以进行版本控制
  • 目标机器上的简单更新(可由用户完成)
  • 确保在更新时仅添加新设置,并且不会使用默认值覆盖现有设置
  • 简单更改用户的设置
  • Win XP和Win 7下的相同工作流程

据我所知,在Windows上存储设置有3种可能性:

  • 注册处
  • Ini文件
  • XML文件

我们套件中只有一个应用程序目前使用Qt,但Boost可用.

对于地址,我们会将它们放在某种XML地址簿中,但对于其他设置,我们不确定,最佳做法是什么.

c++ settings visual-c++

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

覆盖子类中的Qt槽

我有一个基类,它定义了一个Qt插槽

class Base
{
public:
    Base()
    {
        connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
    }
public slots:
    virtual void mySlot()
    {}
}
Run Code Online (Sandbox Code Playgroud)

子类A只是实现了一些其他的东西.子类B覆盖插槽

class SubB : Base
{
public:
    SubB() : Base() 
    {
        // Necessary?
        connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
    }
public slots:
    virtual void mySlot() override
    {}
}
Run Code Online (Sandbox Code Playgroud)

插槽的覆盖是否也替换了之前在Bass构造函数中完成的连接(即SubB中的连接是不必要的)?

c++ inheritance qt

5
推荐指数
2
解决办法
7811
查看次数

没有警告的返回语句后的代码

我们刚刚在我们的代码库中发现了一个问题,即语句在 return 语句之后。

例如

std::string MyClass::addElement(Type1 &item, const std::string &param2)
{
    if (param2.empty())
    {
        // logging
        return "";
    }

    return m_database->addElement(item, param2, item.status, true);

    // here I would expect an unreachable code warning
    m_database->updateTableA(item.p1, item.p2, item.p3, AType::AType23);
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是,为什么我们的编译器(GCC 4.8.5 和 7)不发出警告?

我们编译 -std=c++0x -Wall -Wextra -Wsign-compare -Wunknown-pragmas -Wold-style-cast -Wshadow -Wfatal-errors

c++ gcc dead-code compiler-warnings

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

vsnprintf与%s段错误与GCC

我使用以下方法写入跟踪文件(受/sf/answers/1123224511/启发)

void Tracing::Info( const char*  content, ...)
{
    va_list paramList;
    va_start( paramList, content );

    Tracing::AddRecord(boost::log::trivial::info, content, paramList);
    va_end( paramList );
}

void Tracing::AddRecord(boost::log::trivial::severity_level sev, const char* content, va_list paramList)
{       
    int size = vsnprintf(0, 0, content, paramList) + 1;
    if (size > 0)
    {
        boost::scoped_array<char> formattedString(new char[size]);
        vsnprintf(formattedString.get(), size, content, paramList);

        boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> & lg = my_logger::get();

        BOOST_LOG_SEV(lg, sev) << formattedString.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在Linux下使用以下方法调用该方法(CentOS 7,GCC 4.8.2):

Tracing trace;
trace.Error("No %s root tag found!", rootTag.c_str());
Run Code Online (Sandbox Code Playgroud)

它在AddRecord()中第二次调用vsnprintf时会出现段错误.

如果使用数字格式化程序(例如%i)调用它,它可以正常工作.我已经在Windows(VS2008/2010)下使用这些方法多年没有问题.

我错过了一些明显的东西吗?

c++ printf gcc

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

如何在此代码中返回工作?

它是如何工作的?

struct Person
{
    std::string name;
    std::string address;
};

std::istream &read(std::istream &is, Person &person)
{
    is>> person.name;
    getline(is, person.address);
    return is;
}

int main()
{ 
    Person p; 
    read(cin,p);
}
Run Code Online (Sandbox Code Playgroud)

怎么return is回归两者person.nameperson.address一起getline似乎是分开的is

c++

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

在C中将一个字符与另一个字符相乘

我不明白为什么下面的C程序返回值34?

int main(void)
{
    char c;
    char  c1='a', c2='b';
    c= c1*c2;
    printf("%d", c);
}
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

c

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

结构体中的字符串

#include <bits/stdc++.h>

using namespace std;

struct node
{
    std::string a;
};

int main()
{
    cout << str << endl;
    struct node* p = (struct node*)(malloc(sizeof(struct node)));
    p->a = "a";
    cout << p->a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码产生运行时错误。该结构适用于整数,但是当我尝试使用字符串作为其成员变量时,会发生错误。它还会在代码cheide上给出运行时错误。

c++ string struct

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

这段代码中的“ if block”如何工作?

请考虑以下代码:

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main() {
    int a, b;
    cout << "Enter two integer: ";
    cin >> a >> b;

    if (a > b) {
        int temp = a;
        a = b;
        b = temp;
    }
    cout << a << "<=" << b << endl;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码产生两个插入数字中的最小值。谁能解释if块如何工作?

c++

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

标签 统计

c++ ×7

gcc ×2

c ×1

compiler-warnings ×1

dead-code ×1

inheritance ×1

printf ×1

qt ×1

settings ×1

string ×1

struct ×1

visual-c++ ×1