从Java到C++;:如何在另一个自定义类中使用一个自定义类变量?
假设我有两个Java自定义类,类A和类B:从Java到C++;:如何在另一个自定义类中使用一个自定义类变量?,java,c++,class,Java,C++,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; } } 我想把
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;
}
}
我想把这种情况转化成C++。 类A将或多或少地进行翻译,但当我转到类B并编写此类代码时:
class B {
A a;
int z;
public:
B(A a1, int z1){
a = a1;
z =z1;
}
};
它抱怨说类A没有默认构造函数,所以当我声明
A代码>
在B类的顶部,它不能实例化我的“A”变量(java不在声明实例化,而C++则是,如我理解的那样)。
<> P>这样处理这种情况的C++方法是什么?我应该向A类添加没有参数的默认构造函数,还是不是正确的方法?
非常感谢。在类B中初始化初始化列表中的类a的实例,如soB(a1,int z1):a(a1){…}
这是必需的,因为类B中的类A的实例将在使用默认构造函数执行构造函数体之前初始化,您已经为A定义了自己的构造函数,所以不再有默认构造函数。您也可以用同样的方法初始化z1变量,如下所示:
B(aa1,intz1):A(a1),z(z1){…}
在Java中,类似于以下的声明:
A a;
A a;
意味着您需要一个可以指向类型a的对象的引用。您最终将其设置为:
a = new A(x, y, z);
<>在C++中,最近的简单事物是指针:
A* a;
当你写作时:
A a;
在C++中,你要求编译器在这里创建一个本地对象。因此,必须提供所有构造函数参数。这不是java代码所做的,所以C++中不需要它,如果你正在做的是逐行、直、端口。(提示:最好自己编写一个程序功能的解释,然后从头开始用惯用Java创建Java实现。)
如果你试图从java映射到C++,这是一个非常危险的过程,每个声明都像:
A a;
A a;
必须映射到:
A* a;
或
<>你必须为java的所有存储分配担心。 < P>从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) {}
};
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
std::shared\u ptr,当您只需要管理一个
当需要从多个位置管理对象时
注意:你如何使用Java
和你如何使用C++
之间的差别太大了,我建议你在处理C++
时忘记Java
。作为一门新语言,独立学习C++
,而不必经常提及“Java方式”
推荐书籍:a=a1代码>不是a
的初始化。这是一项任务a
在该语句之前已初始化(或者如果它有默认构造函数,则会初始化,因此会出现错误)
<>在C++中,每个成员变量在进入构造函数体之前初始化为“强”。如果要使用a1
初始化a
,则必须使用:
B(A a1, int z1) : a(a1), z(z1) { /* constructor body */ }
<>这将简单地初始化<代码> A/>代码> <代码> A1 < /C> >代码> Z >代码> Z1,并且是在C++中实现的方式。您能稍微扩展一下这个答案吗?语法是什么意思?为什么它能工作?当您试图在代码中创建类B的实例时,首先要做的是初始化所有类成员,如果类A没有默认构造函数(并且没有您定义的构造函数),编译器不知道如何处理memeber A。然而,初始化列表是在执行构造函数本身之前执行的,因此您可以对其中的类型A的成员使用任何构造函数。你也可以定义一个默认构造函数,并留下任何东西:<代码>:::():x(0),y(0){} /代码>(带有初始化列表),它工作得像<代码>::(){x=0;y=0 } <代码>:“这不是你的java代码正在做的,所以C++中不需要它。”——为什么不呢?在C++中,我们做事的方式不同。在Java中,每个对象变量都是引用,因为没有其他选择。这并不意味着,当把代码翻译成C++时,必须使每个对象变量都是指针。我们把代码翻译成使用C++的习惯用法。为什么你认为它能从根本上改变一个对象从它的函数外部到内部的生命周期?我不知道它是否会或不会。这取决于类的使用方式。不过,您已经更正了您的声明,所以这一点现在没有意义了。A&A
是非法声明。@zenith:不是类成员。+1。到目前为止,唯一一个正确考虑全局的答案,不仅提到了智能指针,而且正确地避免了将它们作为每个问题的完美解决方案。如果我只是在a中添加一个默认的无参数构造函数,这会是一个大问题吗?@user3930976:这取决于。如果一个A
可以用零开始信息以有意义的方式构造,则为否。否则为是。创建“半完整”对象的默认构造函数是一个大问题。