如何在C ++中的类中实现main方法?

时间:2009-10-01 14:12:42

标签: c++

static class EntranceClass {
public:
    static void RegisterSomething()
    {
    }

    static int main()
    {
        RegisterSomething();
        return 0;
    }
} // <-expected unqualified-id at end 

我收到以下错误: 输入main.cpp末尾的预期非限定id问题

有没有解决方案

8 个答案:

答案 0 :(得分:21)

main只是main!功能:

class EntranceClass
{
...
}; //<-- note the semicolon

int main()
{

}

答案 1 :(得分:9)

根据标准,您没有编写真正的main函数。

第3.6.1节第3段:“函数main不得在程序中使用(3.2)。main的链接(3.5)是实现定义的。一个声明的程序main inlinestatic格式不正确。名称main未另外保留。[示例:成员函数,类,和枚举可以称为main,其他名称空间中的实体也可以。{“

这意味着,通过声明成员函数main,您只需声明成员函数。它没有特别的意义,并不意味着课堂上的任何东西都可以独立调用。如果用snicklefrazz替换该函数名和所有引用,该程序将完全相同。

在风格上,snicklefrazz会更好,因为它不会导致标准main函数得出任何可能的结论。

第3.6.1节第1段:“程序应包含一个名为main的全局函数,它是程序的指定开始。它是实现定义的,是否需要在独立环境中的程序定义一个main函数。“

这意味着,除非您正在编写标准称为独立环境(通常用于编写嵌入式系统)的内容,否则您需要定义main全局函数,这是程序启动的地方。

在Java中,类可以有main方法,这是程序在调用类时开始的位置。在C ++中并非如此,并且无法直接实现此目的。

(并且,正如其他人所提到的,class不能是static,而类定义以分号结尾。)

答案 2 :(得分:8)

错误是指在类定义之前使用static关键字 - 编译器在此之后需要一个变量名(因为在C ++中没有static class之类的东西)。

如果你想使用static int EntranceMain::main(void)作为你的程序的入口点,那么一种方法是告诉你的链接器,即给它一个完整的装饰名称。这在很大程度上取决于您使用的编译器和链接器,因此您需要参考其文档。但使用它可能意味着您需要包含启动代码(例如CRT初始化)。

请注意,这不符合标准。

答案 3 :(得分:7)

在右括号后你可能忘记了分号吗?

答案 4 :(得分:1)

您正在寻找Constructor对象?:)

无论如何请尝试删除static ...

答案 5 :(得分:1)

这对我来说似乎是一种糟糕的编码风格,可以将你的主要内容放到课堂上,但如果你真的想这样做,我认为实现更像是这样:

class Foo{
public:
     int main(){ return 0; };
};

Foo bar;

int Foo::main(){
bar.main();
}

正如我所说,这似乎是非常糟糕的编码风格。你最好在.hpp文件中构建你的类,然后将它链接到你的program_main.cpp(通过#include“foo.hpp”),它有int main(){return 0;函数让你调用类。

答案 6 :(得分:1)

  • 在C ++中,你可以拥有“全局”功能,i。即不是任何类的成员(Java语言中的“方法”)的函数。

  • 默认情况下,C ++程序的入口点是“全局”main()函数,通常如下所示:


int main(int argc, char *argv[])
{
  // do stuff
}

main()的参数允许程序获取命令行参数。它们可以像这样省略


int main()
{
 // do stuff
}

在这种情况下,您的程序不会带任何参数。当程序正常退出时,约定是main()返回0.除0之外的返回值通常用于表示错误。

  • C ++中没有静态类的概念。您可以拥有静态成员函数和数据成员,或静态全局变量(从C继承的静态的不同含义)。

  • 在课程定义后你需要一个分号。

答案 7 :(得分:-1)

您可以做的一个技巧是创建一个类似于“BaseApp”的类,该类派生自,然后实现一个调用真实版本的虚函数。

class BaseApp
{
public:
   virtual void   EntryPoint() = 0;
   static  BaseApp* GetApp() { return this; }
};

然后只需从中派生一个类,实现一个EntryPoint(),然后定义你的对象。

class SpecializedApp: public BaseApp
{
public:
   void EntryPoint() { ... }
};

SpecializedApp g_App;

然后,你有main()调用它:

void main()
{
   BaseApp::GetApp()->EntryPoint();
}

这种方法可以使main成为一种通用启动例程,可以根据事物的链接方式调用不同的入口点。您可以在BaseApp之上安装Win32类或标准C类。