我对C ++完全不熟悉。
在Java中:
class MyClass {
public String memberVar;
public MyClass(String memberVar) {
memberVar = memberVar;
}
void myMethod() {
system.out.println(memberVar);
}
void anotherMethod() {
system.out.println(memberVar);
}
}
...
class CallMyClass {
CallMyClass() {
MyClass myClass = new MyClass();
myClass.myMethod();
myClass.anotherMethod();
}
}
在C ++中:
myclass.h
class MyClass
{
public:
QString memberVar;
MyClass(QString memberVar);
void myMethod();
void anotherMethod();
};
myclass.cpp
MyClass::MyClass(QString memberVar)
{
MyClass::memberVar = memberVar;
}
要访问 myclass.cpp 中memberVar
内的方法中的MyClass
,我似乎总是想出一个MyClass
的新实例。
MyClass::myMethod() {
MyClass myClass("Only var");
qDebug() << myClass.memberVar;
}
MyClass::anotherMethod() {
MyClass myClass("Only var");
qDebug() << myClass.memberVar;
}
我可以在实例中初始化一个对象,并在特定调用类中的各种方法中使用它,就像在Java中一样吗?
答案 0 :(得分:3)
以下是它应该是什么样子
MyClass::MyClass(QString memberVar) : memberVar(memberVar)
{}
void MyClass::myMethod() {
qDebug() << memberVar;
}
void MyClass::anotherMethod() {
qDebug() << memberVar;
}
我们使用成员初始化列表来构造成员变量一次。像在Java中一样编写它将首先调用memberVar
的默认构造函数,然后我们将在我们的c'tor的主体中分配它。对于复杂的类型,这可能会严重低估。
答案 1 :(得分:1)
你将构造函数的命名参数命名为类成员:memberVar,如果它是静态的,那么放置MyClass :: memberVar会正常工作,为了清楚起见,你想将参数命名为其他东西,比如说&#39; BLA&#39;然后构造函数看起来像:
MyClass::MyClass(QString BLA) {
memberVar = BLA; // now memberVar refers to the instance member
}
and anotherMethod看起来像这样:
MyClass::anotherMethod() {
qDebug() << memberVar; // memberVar is now instance variable that was initialized in constructor
}
答案 2 :(得分:0)
class MyClass
{
public:
QString memberVar;
MyClass(QString memberVar);
void myMethod();
void anotherMethod();
};
memberVar是一个公共变量
你可以在MyCall内部的所有方法以及其他类中使用它(毕竟它是公共的)
这是有效的。
void MyClass::myMethod() {
qDebug() << memberVar;
}
您只需要范围运算符&#34; ::&#34;当你提到的变量存在歧义时。
在MyClass的构造函数中,您将创建一个与类变量同名的局部变量。现在有歧义。在本部分上面的Java程序中也会发生同样的事情
class MyClass {
public String memberVar;
public MyClass(String memberVar) {
memberVar = memberVar;
}
...
}
Java可能会干净利落地处理这种情况,但它仍然含糊不清。你打算尝试将memberVar设置为等于它自己吗?
你可以通过两种方式缓解歧义。
首先,使用 this 关键字。 我相信这适用于Java和C ++
爪哇
class MyClass {
public String memberVar;
public MyClass(String memberVar) {
this.memberVar = memberVar;
}
...
}
C ++
MyClass::MyClass(QString memberVar)
{
MyClass::memberVar = memberVar;
}
或
MyClass::MyClass(QString memberVar)
{
this->memberVar = memberVar;
}
其次,是我喜欢的方式。只需使用不同的变量名称,就不可能出现歧义。
MyClass(QString myMemberVar)
{
memberVar = myMemberVar;
}
请记住,只有在类中声明了函数时才会有效,因此您不需要放置&#34; MyClass ::&#34;在所有仅在不同范围内定义的内容之前。
以下是我写myclass.cpp的方法
class MyClass {
MyClass(QString myMemberVar)
{
memberVar = myMemberVar;
}
};
注意class关键字如何允许您使用myclass标头的所有函数和变量,而不必使用范围运算符::