【问题标题】:Compiler seems to reject class identifier initialization before member编译器似乎在成员之前拒绝类标识符初始化
【发布时间】:2012-09-20 17:51:10
【问题描述】:

请理解我在写这篇文章时发烧了,此外,我使用 C++ 或类是几年前的事了。

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

这就是我的意思:

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

如果我选择调用这些成员之一(boderX、borderY、menu_item),如下所示:

window.borderX = [some value here];

我得到一个错误的回报:

错误:'.' 之前的预期不合格 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' 没有命名类型

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

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

【问题讨论】:

  • 您的window 示例需要一个对象。第二个需要一个主函数(see reproduced compiler error)。
  • 第一个 window 不起作用,因为您正在访问一个类型的非静态数据成员——您首先需要一个 objectCRectangle 的第二个不起作用,因为您尚未定义 CRectangle::set_values
  • @ildjarn,没错,虽然这是一个链接器错误。不过,现在找到它比在它编译后只给出一个新错误要好。
  • 其实他有一个对象 :) 它的窗口,他需要一个对象的实例。
  • @JonathanCruz,这是一门课。一个类的实例就是一个对象。

标签: c++ compilation mingw


【解决方案1】:

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

您可以在堆栈上创建一个实例,

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

或者在堆上创建一个,

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

【讨论】:

  • 但是如果你不使用 RAII 的东西,在堆上创建一个会产生各种 (哈哈)问题。
  • 不得不再次编辑。不想强加一个不礼貌的立场。但请在发帖前正确阅读原帖。我已经声明了它是如何无法正常工作的。再说一次,不要生病。
  • (添加评论,因为我认为这是一个很好的起点。)@user1707244 您是否在与您的main 函数分开的文件中定义了window 类?如果是这样,您对#include 语句有什么看法?另外,你怎么称呼你的编译器?
  • 好问题。是的,我确实在标题中有它,但这不是问题。我知道这可能是问题所在,所以我提前考虑并在我的 main.cpp 中添加了我的类声明。所以,回答你的问题,是的,我有。
  • @user1707244 好的,那么。在那里,我的怀疑得到了缓解。
【解决方案2】:

试试这个:

首先声明类。在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;
}

希望你早日康复。发烧不好笑。

【讨论】:

  • 不工作!!!我已经在我的原始帖子中展示了它是如何不起作用的!抱歉不礼貌... 返回:main.cpp:8:1: error: 'window' does not name a type and: main.cpp:9:1: error: 'w' does not name a type
  • 仅供参考:您的 main 签名错误。 stackoverflow.com/questions/449851/…
  • 请注意,C++ 区分大小写。他在他的例子中使用了大写的 Window,而你的错误是小写的“window”,所以你要么输入错误,要么没有准确地复制/粘贴他的代码。
  • 你还需要 "std::endl" 而不是 endl;
  • 对,我使用大写的窗口,因为它是一个约定。表示类型的名称必须以大写开头的混合大小写。 @Robᵩ 感谢您指出 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多