在调试模式下运行应用程序时,Visual Studio 输出窗口会显示如下消息:
在 application.exe 中的 0x00007FFB6CA74F69 处引发异常:Microsoft C++ 异常:内存位置 0x0000006C588FEFE0 处的 std::runtime_error。
程序继续运行。如何找到此异常发生的位置?
在调试模式下运行应用程序时,Visual Studio 输出窗口会显示如下消息:
在 application.exe 中的 0x00007FFB6CA74F69 处引发异常:Microsoft C++ 异常:内存位置 0x0000006C588FEFE0 处的 std::runtime_error。
程序继续运行。如何找到此异常发生的位置?
假设有一个具有特定属性的类:
class C {
public int property { set; get; }
}
我想通过另一个类中的类成员传递这个属性。显而易见的解决方案是:
class D {
private C c = new C();
public int property {
set { c.property = value; }
get { return c.property; }
}
}
有一些简化的语法吗?
有条件的:
public int property => c;
甚至可能具有更改访问级别的能力,就像对默认属性所做的那样(没有明确的状态字段)。
在网站上的许多代码示例中,既有表单的条目,也有void main()
程序int main()
的主要功能条目。
哪一个是正确的,有什么区别?
在 Qt 项目中使用 Microsoft 编译器时,程序集窗口会显示编码损坏的错误和警告。例如:
warning C4311: ЇаЁўҐ¤ҐЁҐ вЁЇ®ў: гбҐзҐЁҐ гЄ § вҐ«п Ё§ "Qt::HANDLE" ў "unsigned int" warning C4302: ЇаЁўҐ¤ҐЁҐ вЁЇ®ў: гбҐзҐЁҐ Ё§ "Qt::HANDLE" ў "unsigned int"
如何以足够可读的形式(俄语或英语)显示此类消息?
有些类型很难复制,例如:
struct S
{
int a[100];
};
任务是处理这种类型的变量的值并返回修改后的副本,即 必须保留原件。建议两种方法:
S test(const S& s)
{
S news = s; // делаем копию
news.a[42] = 100500; // изменяем
return news; // возвращаем
}
S test(S s) // делаем копию
{
s.a[42] = 100500; // изменяем
return s; // возвращаем
}
选项 2 在代码方面看起来更短,但是,如汇编所示,按引用传递会导致汇编代码更短。
为什么会发生这种情况?这两种方法的优缺点是什么,以便了解更喜欢哪一种?也许还有其他选择?
任务很简单:有两个值指定初始b
和最终e
角度位置,找出最小旋转角度(即不超过 180 度)及其方向。初始角度以实变量的度数指定。范围[0.0 ... 360.0)
。
原则上,解决方案也很简单:
d = e - b;
abs(d) > 180
,那么r = d - sign(d) * 360
r = d
r
- 所需转弯,其中符号指定方向:+
- 顺时针,-
- 逆时针。
例子:
b = 350, e = 10 => r = +20
b = 100, e = 0 => r = -100
问题是:是否可以在第2步避免分支,同时保证算法在任何角度值的效率,考虑到相等性a = a + n * 360
,n
任何整数在哪里?大概三角函数可以在这里提供帮助。
例如,我将两个数字相除,1 / 2
我希望结果为0.5
,因为我将结果分配给浮点变量,但我得到0
. 这是代码:
#include <iostream>
int main()
{
double d = 1 / 2;
std::cout << d << "\n";
}
0
可能是什么问题呢?
有两个具有自己历史的独立存储库:A和B。在某个时候,决定将B的所有内容放入A。这是通过简单地复制文件来完成的,即。A对此操作有一个提交。此外,存储库A特别开发了那些先前在B中更改的部分。
现在人们意识到将整个东西合并到一个存储库中是不值得的,需要单独开发。
第一个想法:只需将B中应该在A中的所有部分(文件)移动。因此,一个单一的提交将再次出现,你可以继续生活。但我还是想将这些文件的更改历史转移到B存储库。
在这方面,问题是:是否有任何机制允许您在不相关的存储库之间传输提交?不提供手动复制具有相应描述的每个单独状态的选项:) 我想有条件地设置来自A的一系列提交并将它们应用于B。
该项目有一个 git 存储库,一些文件被添加到.gitignore中,因此只存在于本地。不过,我想将其中一些文件保留在本地版本控制之下,以便跟踪其中的更改并在发生某些事情时能够回滚。似乎获得了两个独立的(并行)存储库,但具有公共文件和不同的.gitignore。
这些特殊文件是软件中包含的各种实用程序的配置。根据定义,它们位于不同的位置;不可能为它们创建单个目录。配置的状态不需要存储在服务器上,每个用户的状态都不同。但有时您希望在本地跟踪这些文件的更改并能够快速切换到一个或另一个版本。
控制此类文件的最佳方法是什么?
我们有代码:
struct B
{
virtual void f() {}
};
struct D : B
{
void f(int) { }
};
int main() { }
clang对其发出警告:
'D::f' hides overloaded virtual function [-Woverloaded-virtual]
现在我们f(int)
在类中将其设为静态D
:
struct B
{
virtual void f() {}
};
struct D : B
{
static void f(int) { }
};
int main() { }
代码编译时没有警告。但是,尝试f()
在类对象上使用D
:
int main()
{
D d;
d.f();
}
导致错误:
too few arguments to function call, expected 1, have 0
那些。static f(int)
仍然隐藏功能B
。通过添加using B::f;
类解决了问题D
,代码编译成功。但是问题来了:
B::f()
隐藏静态函数时是否有任何客观原因不发出警告D::f(int)
?
您需要设置一个由条件运算符if
or限定范围的变量switch
。我怎样才能做到这一点?
考虑这段代码:
struct B {};
struct D1 : B {};
struct D2 : B {};
#define get if (s) return d1; else return d2;
volatile bool s;
struct C {
const B& f() const { get }
B& f() { get }
private:
D1 d1;
D2 d2;
};
在这里你可以看到不同的版本f()
应该返回相同的对象(在一种情况下是 const,在另一种情况下不是),基于一些选择逻辑,这可能非常复杂。示例中为了避免重复该逻辑的代码,通过#define
.
f()
是否可以在不借助预处理器服务的情况下避免不同版本中的代码重复?
在 c++17 中,应该可以执行标准算法,例如std::sort
:
template< class ExecutionPolicy, class RandomIt >
void sort( ExecutionPolicy&& policy, RandomIt first, RandomIt last );
同时,传递适当的执行策略类型。目前是否有任何可用的在线编译器支持此功能?
<execution>
到目前为止,所有连接尝试都以大致相同的方式结束:
fatal error: execution: No such file or directory #include <execution> ^~~~~~~~~~~ compilation terminated.
有适用于 C++11的代码:
#include <algorithm>
#include <iostream>
#include <vector>
#include <utility>
#include <iterator>
typedef std::pair<void*, int> pair;
int main(){
std::vector<pair> s;
std::vector<int> r;
pair p1(NULL, 42);
pair p2(NULL, 100500);
s.push_back(p1);
s.push_back(p2);
std::transform(s.begin(), s.end(), std::back_inserter(r), static_cast<const int&(*)(const pair&)>(std::get<1>));
std::copy(r.begin(), r.end(), std::ostream_iterator<int>(std::cout, " "));
}
结论:
42 100500
我想在不使用自定义类型仿函数/函数的情况下在 C++03 中实现类似的东西:
struct F {
int operator()(const pair& p) { return p.second; }
};
或者
int f(const pair& p) { return p.second; }
和这样的电话:
std::transform(s.begin(), s.end(), std::back_inserter(r), F());
这可以通过一系列预构建的库适配器来完成吗?std::get
还没有在 C++03 中。
我也不想for
改用手动循环,因为。transform
这需要提及迭代器的类型,并且算法不是为手动编写循环而发明的。
C++17 有一个新的语法来声明以下形式的变量:
auto [x, y, z] = f();
其中f()
是返回复合对象(数组、元组、结构等)的函数。
这个语法叫什么,它有什么作用?
是否可以在不显式指定其类型(甚至auto
)的情况下在 C++ 中定义变量?