小编Tob*_*emi的帖子

使用默认构造函数强制未初始化的成员声明

我今天发现了这个现象,其中一个成员被不必要地构造了两次:

#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仍然会生成一个成员 - 在构造函数中重新分配时会立即丢弃该成员。这本身似乎也不一致...... …

c++

10
推荐指数
2
解决办法
1384
查看次数

检查路径是否包含 C++ 中的另一个路径

我希望实现类似的目标

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

c++ std

6
推荐指数
1
解决办法
3659
查看次数

如何在不改变的情况下连接到 C++ 路径?

我以为我找到了正确的功能: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")

c++ filesystems std

6
推荐指数
0
解决办法
315
查看次数

WebClient 无法解析

为了利用新的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)

java spring intellij-idea gradle

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

如何有条件地实例化一个对象?

我正在尝试做一些有条件的工作:

Type object;
if (cond) {
    doSomeStuff();
    object = getObject();
    doMoreStuff();
} else {
    doSomeOtherStuff();
    object = getDifferentObject();
    doEvenMoreStuff();
}
use(object);
Run Code Online (Sandbox Code Playgroud)

我能想到解决这个问题的唯一方法是复制use代码(它实际上是我的应用程序中的内联代码)并objectif块的每个分支中声明。如果我想避免重复代码,我必须将它包装在一些 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

c++ optimization class instantiation conditional-statements

3
推荐指数
3
解决办法
139
查看次数

无法访问 AKS 入口的公共 IP

我正在努力让我的 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 访问我的应用程序(负载均衡器配置) …

networking nginx azure azure-aks nginx-ingress

0
推荐指数
1
解决办法
3057
查看次数

为什么 C++ 不支持对未初始化变量的智能分析?

这是 Java 涵盖的一个用例:

int x; // UNINITIALISED
if (condition){
   x = 0; // init x;
}
else return;
use(x); // INITIALISED
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 没有任何未初始化的内存(对于 x)
  • 没有非确定性状态
  • 您不能使用未初始化的变量
  • 该变量确实未初始化,不是null0- 但是这不会泄漏到运行时;我认为编译器会在编译时重构代码,因此仅在必要时才x在减速初始化。x可能在代码中未初始化,但是在运行时它保证会被初始化(这就是为什么在初始化之前尝试使用它时会出现错误的原因)。

据我所见/所闻,C++ 不支持这一点,并且将始终运行默认构造函数 - 如果可用 - 即使它是不必要的。

有趣的是,当默认构造函数不可用时,您实际上会在 Java 中使用未初始化的变量获得相同的行为。因此,C++ 编译器显然可以处理这种行为(因为它类没有默认构造函数)。那么,为什么不完全支持呢?

我认为类似int x = delete[[no-default]] int x为此的语法(为了不破坏任何现有代码)将非常直观。


请注意,在 Java 中int xint x = 0-之间存在差异。与@akuzminykhs 评论相反,它不是“初始化为 0”-我不知道为什么人们会赞成它 …

c++ java

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