gpt4 book ai didi

c++ - 尝试转发声明时 '->' 是什么意思?

转载 作者:行者123 更新时间:2023-11-30 02:42:12 27 4
gpt4 key购买 nike

我刚刚开始尝试 C++。尝试从另一个文件转发声明此类时,我一直遇到此错误:请求'girl'中的成员'get_posx',指针类型为'Vex*'(也许你打算使用'->'?)

这是我在 Qt-Creator 纯 C++ 项目中包含的两个文件:

主要.cpp:

#include <iostream>
using namespace std;

class Vex; //Declares Vex class

class Obj //Object class
{
int x, y;
public:
void set_pos (int,int);
void move (int, int);
int get_posx() {return x;}
int get_posy() {return y;}
};

void Obj::set_pos (int pos_x, int pos_y) //Sets X and Y of Obj
{
x = pos_x;
y = pos_y;
}
void Obj::move (int pos_x, int pos_y) //Changes X and Y of Obj
{
x += pos_x;
y += pos_y;
}

int main ()
{
Obj guy; //Guy as Obj class
Vex* girl; //Girl as (imported)Vex class
guy.set_pos (0,0);
while(true == true)
{
int tempx, tempy;
cout << girl.get_posx(); //Prints x pos. of girl
cout << "\nX Position: " << guy.get_posx() <<endl; //Prints x pos. of guy
cout << "Y Position: " << guy.get_posy() <<endl; //Prints y pos. of guy
cout << "\nX Change:" << endl;
cin >> tempx; //Asks for x change in guy pos.
cout << "Y Change:" << endl;
cin >> tempy; //Asks for y change in guy pos.
guy.move (tempx, tempy);
}
return 0;
}

s.cpp:

class Vex
{
int x, y;
public:
void exp();
int get_pos() {return x;}
};

void Vex::exp()
{
x = 0;
y = 0;
}

我在这里做错了什么,'->' 是什么,我该如何使用它?

最佳答案

我认为你最好先学习 C++,因为你似乎缺乏基础知识;没有冒犯的意思,只是想帮忙。您心中有几个误解以及实现问题。我什至不知道从哪里开始。让我们看看:

  • 堆和栈分配对象之间的区别(又名指针与非指针)。

    Vex* girl; //Girl as (imported)Vex class
    ...
    cout << girl.get_posx(); //Prints x pos. of girl

    在 C++ 中,指针对象成员是通过 -> 访问的,因此您应该将代码修改为:

    cout << girl->get_posx(); //Prints x pos. of girl
    // ^^
  • 什么时候可以使用前向声明。

    class Vex; //Declares Vex class

    当您想访问类成员时,这还不够。您将需要通过 include 指令包含类定义,如下所示:

    #include "vex.h"
  • 在源文件(aka.cpp)中声明类似的类

    这通常是错误的,尽管最终不能确定。如果你这样做,你将无法在不包含源文件的情况下轻松地重用它,这不是真正推荐的做法。

  • 严格来说,C++ 中没有“导入”这样的东西。

    Vex* girl; //Girl as (imported)Vex class
    // ^^^^^^^^

    导入可能在其他编程语言(例如 Python)中作为一个术语出现,但它们的工作方式与包含不同。

  • 过度评论

    该评论不仅有些不全面,而且毫无意义。争取自文档化代码。

  • 您认为它在任何方面都与 Qt 相关。

    它不是,即使你这样标记它。它是通用的(和基本的)C++。

  • 不对不改变成员的方法使用 const。

    对于在代码中获取成员这样的事情,这是一个很好的做法,即:

    int get_posx() const {return x;}
    // ^^^^^
    int get_posy() const {return y;}
    // ^^^^^

    ...和类似的:

    int get_pos() const {return x;}
    // ^^^^^
  • 如何编写阻塞永远循环。

     while(true == true)

    虽然这有效,但这是荒谬的。

    `while(1)`

    或者只是

    `forever()`

    在 Qt 中会更优雅。

  • 不一致的编码风格(例如空间使用)

    void set_pos (int,int);
    // ^ ^
    void move (int, int);
    // ^ ^
    int get_posx() {return x;}
    // ^
  • 不使用缩进

    您的源代码似乎是左对齐的,但这不是word文档。而 C 和 C++ 使用括号,因此它的工作方式不同于例如在 Python 中,很难理解。

  • 你似乎不明白构造函数是什么。

    Obj guy; //Guy as Obj class
    ...
    guy.set_pos (0,0);

    在 C++ 中,您建立构造函数或至少为此类初始化建立“init”方法。严格来说,在 C++11 上,您甚至可以为此避免这种情况,但重点是您不通过设置方法初始化成员。

关于c++ - 尝试转发声明时 '->' 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27328778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com