假设我在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类添加默认构造函数,或者这不是正确的方法吗?
非常感谢.
从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