新类class的定义中,类中函数的域名空间很重要!!!

 

2011-7-12

1、在mainwindow.h 中定义了一个class  MyMainWindow如下:

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

 

#include <QtGui>

#include <QMainWindow>

#include "ui_scct.h"

class QAction;

class QMenu;

 

class MyMainWindow: public QMainWindow

{

     Q_OBJECT

public:

     MyMainWindow();

    

private:

     QTextCodec * fileMenu;

     QMenu * editMenu;

     Ui::MainWindow ui;

};

 

#endif //MAINWINDOW_H

 

2、在mainwindow.cpp文件中定义了MyMainWindow类构造函数的实现:

#include "mainwindow.h"

 

MyMainWindow::MyMainWindow()

{

    

     setWindowTitle(QMainWindow::tr("Stereo_Camera_Calibratin_Tool"));

     ui.setupUi(this);

    

//connect(ui.Spin

}

1)如果没有黄色部分的域名前缀,则compile 时出错,

1>moc_mainwindow.cpp

1>mainwindow.cpp

1>.\mainwindow.cpp(3) : error C2059: syntax error : ')'

1>.\mainwindow.cpp(4) : error C2143: syntax error : missing ';' before '{'

1>.\mainwindow.cpp(4) : error C2447: '{' : missing function header (old-style formal list?)

1>main.cpp

1>   Generating Code...

提示 在MyMainWindow()前应有前缀int,

2)如果变成 int  MyMainWindow()

{。。。。

……..

}

则 出现新的错误:

1>Compiling...

1>moc_mainwindow.cpp

1>mainwindow.cpp

1>.\mainwindow.cpp(6) : error C3861: 'setWindowTitle': identifier not found

1>.\mainwindow.cpp(7) : error C2065: 'ui' : undeclared identifier

1>.\mainwindow.cpp(7) : error C2228: left of '.setupUi' must have class/struct/union

1>        type is ''unknown-type''

1>.\mainwindow.cpp(7) : error C2673: 'MyMainWindow' : global functions do not have 'this' pointers

1>main.cpp

1>Generating Code...

1>Build log was saved at "file://d:\Experiment Data\Microsoft Visual Studio 9\scct\debug\BuildLog.htm"

1>   scct - 4 error(s), 0 warning(s)

3)如果在setWindowTitle前加上域名空间 QMainWindow::setWindowTitle()则又会出现如下错误:

1>moc_mainwindow.cpp

1>mainwindow.cpp

1>.\mainwindow.cpp(6) : error C2352: 'QWidget::setWindowTitle' : illegal call of non-static member function

1>        c:\qt\4.6.2\include\qtgui\qwidget.h(367) : see declaration of 'QWidget::setWindowTitle'

1>.\mainwindow.cpp(7) : error C2065: 'ui' : undeclared identifier

1>.\mainwindow.cpp(7) : error C2228: left of '.setupUi' must have class/struct/union

1>        type is ''unknown-type''

1>.\mainwindow.cpp(7) : error C2673: 'MyMainWindow' : global functions do not have 'this' pointers

1>main.cpp

1>   Generating Code...

同时, ui 这个ui 文件的实例(已经在mainwindow.h中定义Ui::MainWindow ui;)提示不能识别。所以 只有在构造函数前加上 类的域名空间 才能解决问题! 如:MyMainWindow::MyMainWindow()

 

<think>嗯,用户问的是C++中成员函数外什么时候要加域名,什么时候用.或者->运算符。我需要仔细分析这个问题,确保回答准确。 首先,用户可能对C++的作用域解析运算符和成员访问运算符的用法有些混淆。得先理清这两个概念的区别。 成员函数定义时,必须使用名加上::来指明属于哪个。比如,ClassName::functionName()。这时候用户可能想知道,为什么在外部定义的时候需要这个,而在其他地方调用的时候不需要。 然后是调用成员函数的情况。当通过对象实例调用时,如果是对象本身,使用.运算符;如果是指针,则使用->。这一点需要明确举例说明,比如obj.func()和ptr->func()的区别。 用户可能是在写代码时遇到了错误,比如在定义函数时忘记加名,导致链接错误,或者在访问对象成员时错误使用了运算符。这时候需要指出常见错误场景,帮助用户避免。 另外,可能需要解释static成员函数的特殊情况。静态成员函数属于而不是对象,所以可以通过名加::调用,也可以通过对象或指针,但通常推荐使用名的方式。 还要考虑用户的知识水平。如果用户是初学者,可能需要更基础的解释,避免使用太专业的术语,而是用简单例子说明。比如用具体的定义、成员函数外实现的例子,以及调用的不同情况。 需要检查是否有遗漏的情况,比如友元函数是否会影响,但友元函数不是成员函数,所以可能不在这个问题的范围内。但用户可能混淆友元函数和成员函数,所以可以稍微提一下区别。 总结回答的结构应该是先分点说明不同情况,然后举例说明,最后总结对比。这样结构清晰,用户容易理解。 可能用户的实际问题是在实现的时候,成员函数定义写在了外面,但忘记加名,导致编译错误。或者在调用时,错误地使用了.或->,导致程序崩溃。需要指出这些常见错误,并给出正确用法。 确保例子简单明了,比如定义一个Car,有成员函数start(),在定义时用Car::start(),然后创建对象和指针,分别用.和->调用。这样的例子用户容易理解。 还要注意术语的准确性,比如“域名”可能是指作用域解析运算符,即::,要确认用户的问题是否术语正确,可能需要用更常见的说法,比如“名后加::”。 最后,检查是否有其他相关情况需要考虑,比如嵌套、命名空间等,但可能超出问题范围,所以暂时不涉及,保持回答聚焦。</think>在C++中,成员函数的域限定符和访问运算符使用场景可通过以下分步说明理解: 一、作用域解析运算符 `::` 的用法 1. **定义成员函数时必须使用** ```cpp class Car { public: void start(); // 仅声明 }; // 定义时必须添加 Car:: void Car::start() { // ✔️ 正确 cout << "Engine started"; } ``` ❌ 若省略 `Car::` 会导致编译错误: ```cpp void start() { ... } // ❌ 被误认为全局函数 ``` 二、成员访问运算符 `.` 和 `->` 的用法 1. **通过对象实例调用时用 `.`** ```cpp Car myCar; myCar.start(); // ✔️ 对象直接调用 ``` 2. **通过指针调用时用 `->`** ```cpp Car* ptrCar = new Car(); ptrCar->start(); // ✔️ 指针间接调用 ``` 三、对比总结表 | 场景 | 运算符 | 示例 | |-----------------------|------------|--------------------------| | 定义成员函数 | `ClassName::` | `void Car::start(){...}` | | 对象调用成员函数 | `.` | `myCar.start()` | | 指针调用成员函数 | `->` | `ptrCar->start()` | 四、常见错误案例分析 ```cpp class Student { public: void study(); }; // 错误:未加作用域解析运算符 void study() { ... } // ❌ 实际定义的是全局函数 // 正确写法 void Student::study() { ... } // ✔️ ``` 五、特殊场景:静态成员函数 ```cpp class MathUtils { public: static int add(int a, int b); }; // 调用时可用两种方式: MathUtils::add(2,3); // ✔️ 推荐方式 MathUtils obj; obj.add(2,3); // ✔️ 合法但非最佳实践 ``` 通过以上规则,可准确判断何时需要域限定符,何时使用访问运算符。核心原则:定义成员函数时需明确所属域,访问成员时需明确操作对象的方式(直接访问或指针间接访问)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值