使用命名空间时,简单函数不起作用

时间:2013-08-25 07:21:23

标签: c++ namespaces cout

我有以下代码编译并执行而没有错误,但是应该在menu()函数中打印的行永远不会打印。

Menu.cpp

#include "stdio.h"
#include "Menu.hpp"
#include <iostream>
using namespace std;

namespace View
{
 void Menu::startMenu()
    {
    cout << "2\n";
    }
}

Menu.hpp

#ifndef MENU_H //"Header guard"
#define MENU_H

namespace View
{
class Menu
    {
    void startMenu();
    };
}
#endif

我写了一个简单的测试来调用菜单函数,如果它正常工作,输出应该是 1 2 3

但是2从未打印过。

MenuTest.cpp

#include "Menu.hpp"
#include "stdio.h"
#include <iostream>
using namespace std;

int main()
{
    cout << "1\n";
    View::Menu startMenu();
    cout << "3\n";
}

有人能看到这里发生了什么吗?

3 个答案:

答案 0 :(得分:2)

View::Menu startMenu();

声明一个返回View :: Menu类型的函数,也称为most vexing parse

要初始化一个对象并调用它的成员函数,你应该这样做:

View::Menu menu;
menu.startMenu();

顺便说一句,你需要将startMenu()函数设为public:

class Menu
{
public:    //<-----
    void startMenu();
};

live sample。 帮助这有帮助。

答案 1 :(得分:1)

当减去View::Menu startMenu();的括号时,代码

View::Menu startMenu;

是View :: Menu的对象定义,它不调用函数Menu :: startMenu()。那就是"cout << "2\n";"未执行的时间。要进一步拨打Menu::startMenu()

startMenu.startMenu();

答案 2 :(得分:1)

因为你声明了函数“startMenu()”,那就是返回类型“View:Menu” 但是你没有调用函数startMenu()。

尝试制作以下代码:

View::Menu obj;
obj.startMenu();

PS。并将startMenu()设为public:

class Menu
{
    public:
        void startMenu();
};