C ++新手的类成员函数

时间:2017-07-18 14:18:13

标签: c++ member-functions

我是C ++的新手,我目前正在攻读考试,在VisualStudio中搞乱C ++并进行一些实验。 Usuall我使用Java。

我写了一个简单的类来了解如何以及是否有效:

class Point
{
private:
    int x;
    int y;

public:
    Point(int arg1, int arg2)
    {
        x = arg1;
        y = arg2;
    }
};

我为x和y尝试了2个简单的成员函数,只是将存储在x和y变量中的值加倍。

首先我尝试了这个:

void doubleX()
{
    x *= 2;
};

void doubleY()
{
    y *= 2;
};

然后我尝试了这个:

void doubleX()
{
    Point::x = 2 * Point::x;
};

void doubleY()
{
    Point::y = 2 * Point2::y;
};

两者都将放在类定义中。

通过VisualStudio构建时,它给了我这个错误警告: "错误C3867' Point :: doubleX':非标准语法;使用'&'创建指向成员的指针"

试图弄乱地址指针,但是......我真的没有线索。 我想我知道指针基本上是如何工作的,但我不知道如何在我的情况下使用它。

对此问题有任何快速解决方案和解释吗?

提前致谢!

编辑:这是我的整个代码,现在主要问题是

    #include "stdafx.h"
#include <iostream>

using namespace std;

class Point
{
public:
    int x;
    int y;

    Point(int arg1, int arg2)
    {
        x = arg1;
        y = arg2;
    }

    void doubleX()
    {
        x *= 2;
    };

    void doubleY()
    {
        y *= 2;
    };
};

int main()
{
    Point p(1,1);

    int &x = p.x;
    int &y = p.y;

    cout << x << "|" << y;

    p.doubleX; p.doubleY; //error message here

    cout << x << "|" << y;

    cin.get();
}

4 个答案:

答案 0 :(得分:4)

也许你没有在类定义中声明成员函数 ?以下是基于您的课程的完整工作示例:

#include <iostream>


class Point
{
private:
    int x;
    int y;

public:
    Point(int arg1, int arg2)
    {
        x = arg1;
        y = arg2;
    }

    void doubleX()
    {
        x *= 2; /* or this->x *= 2; */
    }

    void doubleY()
    {
        y *= 2;
    }

    int getX()
    {
        return x;
    }

    int getY()
    {
        return y;
    }
};


int main()
{
    Point p(2, 3);

    std::cout << "p.x = " << p.getX() << " | p.y = " << p.getY() << std::endl;

    p.doubleX();
    p.doubleY();

    std::cout << "p.x = " << p.getX() << " | p.y = " << p.getY() << std::endl;

    return 0;
}

您可以将其放在main.cpp文件中,编译并运行它。我使用g++编译器测试它,它工作正常。

答案 1 :(得分:2)

Valy给出的答案是正确的。但我想提醒您,C ++为您提供了另一种声明和定义方法的选择,即在类声明中声明方法并在类声明之外定义它们。这使您可以轻松地将界面和实现分别分为.h.cpp文件,如下所示:

Point.h

class Point
{
private:
    int x;
    int y;

public:
    Point(int arg1, int arg2);
    void doubleX();
    void doubleY();
    int getX();
    int getY();
};

Point.cpp

#include "Point.h"

Point::Point(int arg1, int arg2)
{
    x = arg1;
    y = arg2;
}

void Point::doubleX()
{
    x *= 2;
}

void Point::doubleY()
{
    y *= 2;
}

int Point::getX()
{
    return x;
}

int Point::getY()
{
    return y;
}

// PointTest.cpp

#include "Point.h"

int main()
{
    // Do something with Point here
    Point pt(1, 2);

    std::cout << "Original: (" << pt.getX() << ", " << pt.getY() << ")" << std::endl;

    pt.doubleX();
    pt.doubleY();

    std::cout << "After being doubled: (" << pt.getX() << ", " << pt.getY() << ")" << std::endl;

    return 0;
}

以及如何编译:

g++ -o PointTest PointTest.cpp Point.cpp

答案 2 :(得分:1)

由于声誉无法发表评论但似乎vc ++会输出您在尝试调用时声明的错误消息

Point::doubleX

以下是输出的实时示例: http://rextester.com/ZLCEW66682

您应该创建该类的实例并使用parens

调用该函数

答案 3 :(得分:-2)

在你的第二组功能中

void doubleX()
{
    Point2::x = 2 * Point2::x;
};

void doubleY()
{
    Point2::y = 2 * Point2::y;
};

如果您希望它们是Point类的成员函数,Point::y ...这不是您应该如何访问成员数据。只能访问静态成员变量。正确的方法是

void doubleX()
{
    this->x = 2 * this->x;
};

void doubleY()
{
    this->y = 2 * this->y;
};

那是使用this指针。