编译器似乎拒绝成员之前的类标识符初始化

时间:2012-09-28 20:21:09

标签: c++ compilation mingw

请理解我写这篇文章的时候发烧很厉害,此外,几年前我已经使用过C ++ - 或类似的课程。

我的问题在于g ++编译器拒绝我调用类标识符(+成员说明符),以及该类的实际成员。

这就是我的意思:

class window{
public:
int borderX, borderY, menu_item;
};

如果我选择调用其中一个成员(boderX,borderY,menu_item),请执行以下操作:

window.borderX = [some value here];

我收到错误的回复:

  

错误:'。'之前的预期unqualified-id令牌

当我查看cplusplus的网站时,此代码在语法上不正确。然而,它拒绝编译?

以下是cplusplus网站的一个例子:

class CRectangle {
    int width, height;
  public:
    void set_values (int, int);
    int area (void) {return (width * height);}
};
CRectangle rect;
  rect.set_values (3,4);

此代码也不编译!

它返回此错误:

  

错误:'rect'没有命名类型

我不明白为什么它会返回这些错误。窗口IS用作标识符 - 或其类型。其次,它不会从编写C ++使用的网站本身编译代码。

我正等着纠正这些问题。 另外,为了记录,我使用的是MingW。 Code :: Blocks和Netbeans都产生相同的结果(是的,我知道它们是IDE,而不是编译器。)

3 个答案:

答案 0 :(得分:4)

'window'定义了类,但是你需要创建该类的实例才能使用它的非静态成员和方法。

您可以在堆栈上创建实例

window w;
w.borderX = [some value here];

或者在堆上创建一个

window *w = new window();
w->borderX = [some value here];

答案 1 :(得分:3)

试试这个:

首先声明该类。在window.h中

#include <iostream> // for cout and endl

class Window{
public:
    int borderX, borderY, menu_item;
};

在启动程序的主文件中:

#include <window.h>
int main() {
    // 1. make an instance of Window
    Window w;         

    // 2. set some values
    w.borderX = 12;   
    w.borderY = 8;
    w.menu_item = 7;

    // 3. print the values
    std::cout << "X: "  << w.borderX 
              << " Y: " << w.borderY 
              << " menu item: " << w.menu_item << std::endl;

    //OR with a pointer
    // 1. create a new pointer that points to 
    //    an instance of Window (which is also create in the process)
    Window pw = new Window(); 

    // 3. set some values
    pw->borderX = 9;           
    pw->borderY = 12;
    pw->menu_item = 18;

    // 3. print the values
    std::cout << "X: "<< pw->borderX << " Y: " << pw->borderY 
              << " menu item: " << pw->menu_item << std::endl;

    // 4. Rule: for every *new* (new Window()) there is 1 delete
    //    So every pointer should be deleted somewhere 1 time to avoid memory leaks
    delete pw; 

    return 0;
}

我希望你很快好起来。发烧并不好笑。

答案 2 :(得分:0)

我相信你的问题是你把语句放在只能放置类型定义和变量(对象)声明的地方 - 全局范围。您不能将赋值语句放在全局范围内的语句。你必须把它放在函数体内。

您可以放在任何地方的声明/定义。

类似这样的定义:

class window{
public:
int borderX, borderY, menu_item;
}; 

<强>的main.cpp *

// global scope
window w; // this works - this is how you declare object of type window
w.borderX = 7; // this does not work - this is statement it must be within function

int f() {
  w.borderX = 7; // this works
  return 0;
}