使用 scope 运算符 (::) 引用另一个文件中的类



我有一个main.cpp文件,开头有#include "engine.h"

里面engine.h

#include "myObject.h"
namespace nmspc{
MyObject obj1;
//some code here
}

myObject.h有:

#include <iostream>
class MyObject{
public:
void helloWorld(){
std::cout << "Hello, World!" << std::endl;
}
}

为什么我不能在我的main.cpp中提到这样的东西?

int main{
nmspc::obj1::helloWorld();
return 0;
}

相反,我必须键入nmspc::obj1.helloWorld()MyObject::helloWorld()。但我想使用上面的那个。

可以使用静态成员函数执行类似操作,方法是在方法声明之前添加关键字static。 如果这样做,该函数将不会与类的实际实例化相关联,因此无法访问任何成员变量或非静态成员函数。

通常,您不会通过创建的对象访问静态成员函数,而是通过类名访问静态成员函数(尽管可以通过实例调用它(。

class MyObject{
public:
static void helloWorld() {
std::cout << "Hello, World!" << std::endl;
}
}
int main{
MyObject::helloWorld();
return 0;
}

是否应该这样做取决于上下文。你的程序很简单,目前还不清楚为什么你会把它变成一个静态成员函数,而不是一个自由函数,但我不确定我是否有足够的上下文来提供建议。

所有
不正确的标头内容中的第一个

#include "myObject.h"
namespace nmspc{
MyObject obj1;
//some code here
}   

这应该在 cpp 模块中,即:一个翻译单元
,因为它是一个实例化,即一个dynamic related的东西(运行时影响代码(
而标头是所有静态相关内容的位置

如果想写MyObject::helloWorld((
可以在这里

myObject.h :

#include <iostream>

namespace nmspc{

class MyObject{
public:
void helloWorld();
};
MyObject::helloWorld(){
std::cout << "Hello, World!" << std::endl;
}
}

因为::(作用域解析操作(是名称空间或类/结构所指的,
例如nmspc::MyObject::helloWorld

可能是类helloWorldMyObject属于nmspc名称空间可能是
helloWorld类属于MyObject名称空间属于nmspc命名空间。 等

int main{
MyObject obj1;
//some code here
nmspc::obj1.helloWorld();
return 0;
}

相关内容

最新更新