【问题标题】:not declare in scope when compiled g++编译g ++时不在范围内声明
【发布时间】:2017-02-27 04:30:08
【问题描述】:

这是我的 A.h 文件

class A
{
public:
    void menuChoice();
void displaystartingMenu(); //EDIT
};

这是我的 A.cpp 文件

#include "A.h"

void displaystartingMenu()
{


    cout<<"Please enter your choice:";


}
void A::menuChoice()
{
    displaystartingMenu();
    cout<<"Hello"<<endl;

}
int main()
{ 
   A a;
   a.menuChoice();

}

我试着放了

void menuChoice();

在我的 cpp 文件的顶部,但它仍然无法编译。它给了我错误

在函数“int main()”中:A.cpp:112:13: 错误:“menuChoice”未在此范围内声明 menuChoice();

如何编译:g++ A.cpp A.h

正确地我什至不需要声明cpp顶部的函数,因为我已经在我的头文件中声明了它并且我已经包含在我的.cpp中。这里出了什么问题?

编辑:

错误:

 In function `A::menuChoice()':
A.cpp:(.text+0x229): undefined reference to `A::displaystartingMenu()'

【问题讨论】:

  • 你的意思是A a; a.menuChoice();
  • 在调用A 中的函数之前,您需要一个A 的实例。这就是课堂的运作方式。如果您不希望那样,请不要使用课程。
  • 但是如果我有另一个方法() 已经在类中声明为 public 放置在 menuchoice(); ,我是否必须在 menuchoice() 中创建 A 的实例;也? if method() 只是一个 cout @immibis
  • @user2601570 不。在成员函数内部,有一个类的“当前实例”,默认情况下您可以访问该实例的函数和变量。
  • @user2601570 这可能意味着你没有定义它。

标签: c++ linux ubuntu scope scope-resolution


【解决方案1】:

选项 1:创建一个 A 实例并调用该实例的 menuChoice 方法:

#include <iostream>

class A {
public:
        void menuChoice();
};

void A::menuChoice() {
        std::cout << "Hello" << std::endl;
}

int main() {
        A a;
        a.menuChoice();
        return 0;
}

选项 2:将 menuChoice 设为静态方法并将其称为 A::menuChoice

#include <iostream>

class A {
public:
        static void menuChoice();
};

void A::menuChoice() {
        std::cout << "Hello" << std::endl;
}

int main() {
        A::menuChoice();
        return 0;
}

编辑:解决新问题,当您尝试定义 A::displaystartingMenu 时,您写道:

void displaystartingMenu() {
    // ...
}

必须这样定义:

void A::displaystartingMenu() {
    // ...
}

【讨论】:

  • 但是如果我有另一个方法();放置在 menuchoice() 中; ,我必须在 menuchoice() 中做同样的事情;也一样?
  • @user2601570, menuChoice 是一个方法,你不能在其中放置另一个方法。你可以有一个单独的方法,你可以从menuChoice 调用,这是你的意思吗?
  • 不,如果我已经在类中声明了一个方法,那么我在 menuchoice() 中调用它;它不起作用,它说未定义的引用
  • @user2601570,然后用这个新问题扩展你的问题,我猜不出你做错了什么
  • 我接受您的回答并扩展我的问题,因为我发布的原始问题存在潜在问题。请检查我的编辑!谢谢
【解决方案2】:

menuChoice是类A的一个非静态成员函数,调用它需要实例化一个对象A,如下

int main()
{
  A a;
  a.menuChoice();

  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多