如何在C ++中跨成员函数访问成员变量

时间:2016-11-08 19:24:19

标签: c++ qt

  

我对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中一样吗?

3 个答案:

答案 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)

myclass.h中的

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标头的所有函数和变量,而不必使用范围运算符::