从Java到C++:如何在另一个自定义类中使用一个自定义类var?

use*_*976 2 c++ java class

假设我在Java,A类和B类中有两个自定义类:

class A {
    int x;
    int y;
    public A(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

class B {
    A a;
    int z;
    public B(A a, int z) 
    {
        this.a = a;
        this.z = z;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将这种情况转化为C++.

A类会或多或少地翻译,但是当我去B班并编写这样的代码时:

class B {
    A a;
    int z;
    public:
    B(A a1, int z1){
        a = a1;
        z =z1;
    }  
};
Run Code Online (Sandbox Code Playgroud)

它抱怨说A类没有默认构造函数,所以当我A a; 在B类顶部声明 它无法实例化我的"a"变量时(Java不会在声明时实例化,而C++会根据我的理解).

那么处理这种情况的正常C++方法是什么:我应该在没有参数的情况下向A类添加默认构造函数,或者这不是正确的方法吗?

非常感谢.

Gal*_*lik 6

从Java到C++的转换对上下文非常敏感.它们实际上是非常不同的语言,它在很大程度上取决于您要实现的目标.

在Java中,用户定义的类型都通过引用访问.C++中的功能等价物是一个指针.但是在C++中,您可以像内置类型一样直接访问对象.所以你可以这样写:

class A {
    int x;
    int y;

public:
    // note: we don't initialize members in the body
    A(int x, int y): x(x), y(y) {}
};

class B {
    A a;
    int z;

public:
    B(A a, int z): a(a), z(z) {}
};
Run Code Online (Sandbox Code Playgroud)

C++为您提供了更多如何引用用户定义类型的选项,因此它实际上取决于您需要解决的更大问题.

其他一些可能性:

std::shared_ptr<A> a; // much more Java-like (slower)
std::unique_ptr<A> a; // when you need one copy only (more common)
A* a; // when you need to live dangerously
A a; // use it more like a built-in
Run Code Online (Sandbox Code Playgroud)

参考文献:

std::unique_ptr 当你只需要管理一个

std::shared_ptr 当需要从多个地方管理对象时

注意:您使用方式Java与使用C++方式之间的差异如此之大,以至于我建议Java您在处理时忘记这一点C++.C++独立学习作为一种新语言,而不必经常提到做事的"Java方式".

推荐书籍:The Definitive C++ Book Guide and List