【问题标题】:Class has no member speak? [closed]班级没有成员发言? [关闭]
【发布时间】:2018-10-29 00:31:32
【问题描述】:

我刚刚开始学习类,我正在尝试编写一个非常简单的代码,称为 cat。

在我的 main、h 和 cpp 文件中,它说“Cat”类没有成员“speak”现在正在寻找可能的解决方案,但找不到任何帮助。 如果我将 void Cat::speak() 放入我的 h 文件中,它会更正其他两个,但随后会显示“成员减速中不允许使用限定名称” //主要

#include <iostream>
#include "Cat.h"

using namespace std;

int main() {

Cat jim;

jim.speak(); //CLASS "CAT" HAS NO MEMBER "SPEAK"

return 0;
}

//cat.h

#pragma once

#ifndef CAT_H_
#define CAT_H_

class Cat {
public:
void::speak(); //THE GLOBAL SCOPE HAS NO SPEAK
};

#endif /*CAT_H_*/

//cat.cpp

#include <iostream>
#include "Cat.h"

using namespace std;

void Cat::speak() {     //CLASS "CAT" HAS NO MEMBER "SPEAK"
cout << "Meow!" << endl;
}

【问题讨论】:

  • 在你的头文件中,使用void speak();而不是void::speak();

标签: c++ visual-c++


【解决方案1】:

void::speak(); //THE GLOBAL SCOPE HAS NO SPEAK

将其解释为void ::speak(),其中以:: 开头的标识符(名称)表示C++,“查看所有名称的全局范围”。 :: 是“范围解析运算符”

在头文件中,你应该只使用void speak();,因为 C++ 在你的类声明中看到它,因此知道它是类的一部分。

【讨论】:

  • 谢谢你,我注意到这些细节很慢。
  • 没问题,如果它解决了您的问题,请务必使用复选标记将其标记为已接受的答案。
【解决方案2】:

它甚至是如何尝试编译这一行的:void::speak();? 你到底是什么意思? void 命名空间内的方法 speak()?但void 是保留的类型名。再说了,为什么会在类里面呢?

我猜到了,您试图改用 void speak();

【讨论】:

  • 是的,我认为这是一个更大的问题,结果它是我能遇到的最小的问题。谢谢
【解决方案3】:

void::speak()

我想我会附和这个答案。但是上面的行是你的问题。本质上,您要求程序做的是查看void 命名空间的范围。但是,void 是保留的类型名,据我所知,其中没有名为 speak() 的函数。

这是using namespace std 的问题之一。通常,当您使用标准库中的某些内容时,以string 为例,您会说:“我需要在此处声明一个来自标准库的字符串。std::string hello 是一个非常好的示例,它指出,”字符串属于标准库范围。”using namespace std 是不好的做法,你会摸索尝试像 void::speak() 这样的东西,这又是要求从 void 的命名空间中获取它。

话虽如此,在类中,头文件通常用于声明稍后将使用的函数。在cpp 文件中,您只是说,我有一个类Cat 并且在Cat 的范围内我将使用函数speak()。所以speak() 属于Cat 类,并且在Cat 的范围内。这就是为什么在cpp 文件中,您调用void Cat::speak()

总而言之,你的头文件应该是:

class Cat
{
  public:
    void speak(); // the class has a public function named speak.
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多