该标准的 C++的书说,对于类类型成员的默认构造函数被隐式生成默认构造函数调用,但内建类型不被初始化.但是,在此测试程序中,当在堆中分配对象或使用临时对象时,我得到意外的结果:
#include<iostream>
struct Container
{
int n;
};
int main()
{
Container c;
std::cout << "[STACK] Num: " << c.n << std::endl;
Container *pc = new Container();
std::cout << "[HEAP] Num: " << pc->n << std::endl;
delete pc;
Container tc = Container();
std::cout << "[TEMP] Num: " << tc.n << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
[STACK] Num: -1079504552
[HEAP] Num: 0
[TEMP] Num: 0
Run Code Online (Sandbox Code Playgroud)
这是一些编译器特定的行为吗?我真的不打算依赖它,但我很想知道为什么会这样,特别是第三种情况.
c++ constructor initialization default-constructor object-initialization
基本上,我想从1)到2) 我通常首先水平分割然后垂直分割,但是因为我想要这样做三向差异,通过运行启动vim更方便:
$ vimdiff file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
然后做一些事情来打开下面的分割窗口.
1)
+----+----+----+
¦ ¦ ¦ ¦
¦ f1 ¦ f2 ¦ f3 ¦
¦ ¦ ¦ ¦
+----+----+----+
2)
+----+----+----+
¦ ¦ ¦ ¦
¦ f1 ¦ f2 ¦ f3 ¦
+----+----+----+
¦ f4 ¦
+--------------+
Run Code Online (Sandbox Code Playgroud)
有谁知道这种方法?
我发现从朋友类访问班级的私人成员时遇到问题.
包含我想要更改的私有成员的类以及进行更改的类位于不同的名称空间中.
友元类是在持有数据的类之后定义的,所以我试图在名称空间之外转发声明友元类.
g ++说我无法修改成员,因为它是私有的,视觉工作室似乎认为它很好.
我在这里做一些奇怪的非标准事吗?为什么我不能改变会员?这是一个代表我的问题的简化代码段:
struct S;
namespace N
{
class A
{
int m;
public:
A():m(5){};
friend struct S;
};
}
using namespace N;
struct S
{
A& a;
S(A& a):a(a) {}
void changeA(){ a.m = 9; }
};
int main()
{
A a;
S s(a);
s.changeA();
}
Run Code Online (Sandbox Code Playgroud) 我使用 argparse 将多个位置参数解析为input,然后将多个位置参数解析为output。由于参数的数量不受限制,我尝试将其用作--分隔符。--我通常使用分隔符成功nargs=argparse.REMAINDER,所以我尝试了以下方法:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("input", nargs='+')
parser.add_argument("output", nargs=argparse.REMAINDER)
args = parser.parse_args("input1 input2 -- output1 outpu2".split())
print(args)
Run Code Online (Sandbox Code Playgroud)
但是,所有参数都已放入input,我得到以下输出:
Namespace(input=['input1', 'input2', 'output1', 'outpu2'], output=[])
Run Code Online (Sandbox Code Playgroud)
已--正确使用,但它不充当分隔符。
有没有办法使用 来实现这一点argparse?
我有一组 256 色(xterm-256color 终端中的所有可用颜色),并且我使用了一个名为 256colors2.pl 的脚本,我在几乎每篇讨论 256 色终端的 Internet 文章中都看到了该脚本。这是脚本的输出是一个 6x6x6 颜色的立方体,布局为一系列 6 个 6x6 立方体切片,加上一条从黑色到白色的灰色线。
我正在寻找的是一些 2D 形状,以及在 2D 中布置这些颜色的相应算法,以便所有过渡都是平滑的。这应该适用于一组减少的颜色(在这种情况下为 256,其中包括一组有限的灰色)。
在Python 3.7中,我可以使用默认值创建一个数据类InitVar:
from dataclasses import dataclass, InitVar, field
@dataclass
class Foo:
seed: InitVar[str] = field(default='tomato')
stored: str = field(init=False)
def __post_init__(self, seed: str):
self.stored = f'planted {seed}'
print(Foo())
Run Code Online (Sandbox Code Playgroud)
现在,我尝试创建一个具有可变默认值的类似数据类,而我需要使用它:default_factory
from dataclasses import dataclass, InitVar, field
from typing import List
@dataclass
class Bar:
seeds: InitVar[List[str]] = field(default_factory=list)
stored: List[str] = field(init=False)
def __post_init__(self, seeds: List[str]):
self.stored = [f'planted {seed}' for seed in seeds]
print(Bar())
Run Code Online (Sandbox Code Playgroud)
但是,这是无效的。Python加注TypeError: field seeds cannot have a default factory …
我使用sqlalchemy作为模型化数据库的可读方式,我只对从我的模型生成多个引擎的数据库定义感兴趣.
我的表中的一些列具有类型Enum,在MySQL等引擎中工作正常,因为它具有本机枚举支持.但是对于SQL Server,它会生成列,VARCHAR并设置约束以检查值是否在我指定的预期枚举值范围内.
我想用基于数字的回退替换此替代方法,以便列类型实际上是数字,并且约束检查数值是否在枚举大小的范围内(假设以0开头的连续值).
我曾尝试创建一个TypeDecorator与Enum作为impl,但是这是不够的或我不知道如何使它发挥作用.我还尝试只复制布尔类型的代码并将其与Enum类型混合以创建我自己的类型,但似乎也需要数据库编译器支持.
有没有一种方法可以实现这一点,而无需修补sqlalchemy本身?
请注意,我对使用python查询数据库不感兴趣,在生成之后,我已经完成了,所以这可能会简化.
python ×3
c++ ×2
algorithm ×1
argparse ×1
color-picker ×1
color-theory ×1
colors ×1
constructor ×1
python-3.7 ×1
split ×1
sqlalchemy ×1
vim ×1
vimdiff ×1