我今天发现了这个现象,其中一个成员被不必要地构造了两次:
#include <iostream>
class Member {
public:
Member() {
std::cout << "Created member (default)" << std::endl;
}
Member(int i) {
std::cout << "Created member: " << i << std::endl;
}
};
class Object {
Member member;
public:
Object() {
member = 1;
}
};
int main() {
Object o;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法声明成员未初始化- 而不是使用默认构造函数 - 从而迫使您在构造函数中使用初始化列表?
在 Java 中,如果您像这样定义一个成员:Member i;并且您没有在每个构造函数中初始化它,那么在尝试使用它时,您将收到一个错误,指出该字段可能未初始化。
如果我从Member类中删除默认构造函数,我会得到我想要的行为 - 编译器强制您为每个构造函数使用初始化列表 - 但我希望这通常发生,以防止我忘记使用这种形式(当默认构造函数可用时)。
本质上,我想要防止错误地使用默认构造函数,但它看起来不存在......
即使使用explicit关键字标记构造函数,Member member仍然会生成一个成员 - 在构造函数中重新分配时会立即丢弃该成员。这本身似乎也不一致...... …
我希望实现类似的目标
if (basePath.contains(subPath)) {
// subPath is a subPath of the basePath
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过遍历 的父母并在途中subPath检查来实现这一点。basePath
有没有std办法呢?
std::filesystem::path("/a/b/").contains("/a/b/c/d") == true
我以为我找到了正确的功能:std::filesystem::path::concat做类似的事情
auto b = path(C:a/b);
const auto c = b.concat(/c);
Run Code Online (Sandbox Code Playgroud)
c具有正确的值,但b发生了变异(最终等于c)。
我想b保持不受影响。根据文档,concat相当于operator+=. 然而,没有operator+。
我认为这是一个奇怪的设计,因为有类似的operator/=和operator/where/意味着子目录而不是字面 concat (如+=)。
我可以在没有类似的东西的情况下进行这种非变异连接吗const auto c = std::filesystem::path(b.string() + "/c")?
为了利用新的WebClientAPI,我已将其包含spring-webflux在我的 Intellij 项目中。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compile 'org.springframework.boot:spring-boot-starter-webflux'
// compile group: 'org.springframework', name: 'spring-webflux', version: '5.2.7.RELEASE'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
Run Code Online (Sandbox Code Playgroud)
然而,WebClient 仍未解决:
C:\Users\tobia\Documents\spring-app\service\Service.java:25: error: cannot find symbol
System.out.println(WebClient.Builder());
^
symbol: variable WebClient
location: class Service
Run Code Online (Sandbox Code Playgroud)
依赖关系本身似乎已经解决,就像webflux现在在我的“外部库”列表中一样:
有人知道为什么WebClient仍未解决吗?
我已经尝试了所有 4 个依赖项删除,但没有一个起作用:
compile 'org.springframework.boot:spring-boot-starter-webflux'
compile group: 'org.springframework', name: 'spring-webflux', version: '5.2.7.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation group: 'org.springframework', name: 'spring-webflux', version: '5.2.7.RELEASE'
Run Code Online (Sandbox Code Playgroud) 我正在尝试做一些有条件的工作:
Type object;
if (cond) {
doSomeStuff();
object = getObject();
doMoreStuff();
} else {
doSomeOtherStuff();
object = getDifferentObject();
doEvenMoreStuff();
}
use(object);
Run Code Online (Sandbox Code Playgroud)
我能想到解决这个问题的唯一方法是复制use代码(它实际上是我的应用程序中的内联代码)并object在if块的每个分支中声明。如果我想避免重复代码,我必须将它包装在一些 use 函数中,就像上面一样。在实际情况下,此use函数可能需要 5 个以上的参数来基本上继承上下文。这一切看起来很混乱,无法维护。
if (cond) {
doSomeStuff();
Type object = getObject();
doMoreStuff();
use(object);
} else {
doSomeOtherStuff();
Type object = getDifferentObject();
doEvenMoreStuff();
use(object);
}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?Type没有默认构造函数,因此片段 1 无法编译。
其他一些语言支持片段 1 - 相关问题:Forcing uninitialised Declaration of member with a default constructor
我正在努力让我的 AKS 集群正常工作。我无法访问我的服务的公共IP(使用 nginx-ingress-controller )我尝试了azure负载均衡器入口,但这不起作用我在我的azure控制台中创建了一个静态公共IP并将其分配给我的nginx入口控制器 -该 IP 也不起作用我也尝试删除 kube-proxy pod,因为有些人抱怨这些在重新创建其入口后不会更新,因此他们必须通过删除它们来重新创建。这不是没有设置入口规则的问题,因为我收到连接超时(甚至无法访问 IP)而不是 404 错误
这是我的入口配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
annotations:
appgw.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- api.app
secretName: tls
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app
port:
number: 8080
Run Code Online (Sandbox Code Playgroud)
这是我的服务
$ kubectl get svc -A
default kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 2d1h
default app LoadBalancer 10.0.85.118 20.81.3.210 8080:30578/TCP,6565:31233/TCP 171m
ingress ingress-nginx-controller LoadBalancer 10.0.21.143 20.121.107.7 80:31325/TCP,443:31584/TCP 18m
Run Code Online (Sandbox Code Playgroud)
我可以通过该服务的公共 IP 访问我的应用程序(负载均衡器配置) …
这是 Java 涵盖的一个用例:
int x; // UNINITIALISED
if (condition){
x = 0; // init x;
}
else return;
use(x); // INITIALISED
Run Code Online (Sandbox Code Playgroud)
笔记:
null或0- 但是这不会泄漏到运行时;我认为编译器会在编译时重构代码,因此仅在必要时才x在减速时初始化。x可能在代码中未初始化,但是在运行时它保证会被初始化(这就是为什么在初始化之前尝试使用它时会出现错误的原因)。据我所见/所闻,C++ 不支持这一点,并且将始终运行默认构造函数 - 如果可用 - 即使它是不必要的。
有趣的是,当默认构造函数不可用时,您实际上会在 Java 中使用未初始化的变量获得相同的行为。因此,C++ 编译器显然可以处理这种行为(因为它的类没有默认构造函数)。那么,为什么不完全支持呢?
我认为类似int x = delete或[[no-default]] int x为此的语法(为了不破坏任何现有代码)将非常直观。
请注意,在 Java 中int x和int x = 0-之间存在差异。与@akuzminykhs 评论相反,它不是“初始化为 0”-我不知道为什么人们会赞成它 …
c++ ×5
java ×2
std ×2
azure ×1
azure-aks ×1
class ×1
filesystems ×1
gradle ×1
networking ×1
nginx ×1
optimization ×1
spring ×1