2014-12-06 50 views
1

我刚开始尝试C++。当试图从另一个文件中转发声明这个类时,我一直遇到这个错误: 对'girl'中成员'get_posx'的请求,它是指针类型'Vex *'(也许你打算使用' - >'? )' - >'在尝试转发声明时意味着什么?

这些都是我已经包含在我的Qt造物主平原C++项目的两个文件:

main.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; 
} 

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

+1

由于' - >'在任何前向声明中都没有使用,因此标题具有误导性。 – greatwolf 2014-12-06 05:58:17

回答

3

我想你会更好地学习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" 
    
  • 声明类一样,在源文件(又名CPP)

    这通常是错误的,虽然不是最终的当然。如果你这样做,你将无法轻松地重用它,除非包含源文件,这是不推荐的。

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

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

    导入可能在其他编程语言(如python)中找到,但这些工作与包含的工作方式不同。

  • Overcommenting

    不仅是评论有点不全面,但即使是毫无意义的。争取自我记录代码。

  • 你认为它是以任何方式与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中

    会更优雅。

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

    ​​
  • 不使用缩进

    你的源代码,似乎是左对齐,但这不是一个word文档。而C和C++使用括号,所以它可以工作,而不像在Python中,很难理解。

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

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

    在C++中,您建立了一个构造函数或至少用于这种初始化的“init”方法。严格来说,使用C++ 11时,您甚至可以避免这样做,但重点是您不通过设置方法来初始化成员。

+0

谢谢,在此之前,我从一些旧书和Python中学到了非常古老的C++。它很难转换。 – Fred 2014-12-06 10:18:31

0

女孩被声明为一个指向对象VEX:

VEX *女孩

因为你需要使用 - >运算符代替。以解决女孩对象成员:

girl-> get_posx();

还,因为它是指针,你需要正确的对象初始化它:

VEX *女孩=新VEX();

其他方式你会得到一个错误。

+0

这不会解决OP的问题,因为你不能在这样的情况下转发声明... – lpapp 2014-12-06 06:50:20

+0

它是在单独的文件中,因此#include“s.h”将执行此操作。但是,在使用之前,类对象肯定需要被创建和初始化,因为现在它只是一个指向随机存储器地址的空指针。 – Dmitry 2014-12-06 08:39:47

+0

目前,甚至没有,因为OP在源文件中而不是头文件中。 – lpapp 2014-12-06 08:41:52