C ++主要可以在类中并调用派生类吗?

时间:2013-02-26 04:48:08

标签: c++

我是使用类/对象的新手。我正在尝试写这样的东西:

class C1{

    main ()
    {
         C2::foo();
    }
};

class C2:public C1
{
public:
    foo()
    {
    }
};

当调用C2 :: foo()时,编译器抱怨C2不是类或命名空间。如果我在前面移动C2类定义,则不定义C1。可以在这做什么?

4 个答案:

答案 0 :(得分:2)

您可以使用名为main的成员函数创建一个类,但 main被调用以启动您的程序 - 需要是一个全局函数(在任何类或命名空间之外)。但是,是的,名为main的成员函数完全没问题(§3.6.1/ 3):

  

名称main未另外保留。 [示例:成员函数,类和枚举可以被称为main,其他名称空间中的实体也可以被称为class C1 { int main(); }; class C2 : public C1 { public: int foo(); // or perhaps: static int foo(); }; int C1::main() { C2::foo(); // given `C2::static int foo();` // otherwise: C2 c; c.foo(); } 。 - 结束示例]

至于如何安排代码,通常会得到类似的结果:

{{1}}

答案 1 :(得分:1)

主要不应该在课堂内。

答案 2 :(得分:1)

不,main不能在课堂内。 (为了说清楚,你可以在一个类中使用名为main的函数,但它们不是你程序的入口点。)

(C ++标准版n3337,第3.6.1节)

  

程序应包含名为main全局函数   指定的计划开始。

答案 3 :(得分:1)

main 可以在一个类中。但它与入口点main不一样,它必须是全局的!

以下是一个例子:

#include <iostream>

using namespace std;

class C2 {
   public:
     void foo() {
        cout << "Foo!";
    }
};

class C1 {
   public:
     void main() { // not the same as the entry-point `main`
       cout << "What?";
       b.foo();
     }
  private: 
     B b;
};



int main() //actual entry point `main`
{
   A a;
   a.main();
   return 0;
}

但是请注意,您的代码存在严重缺陷,因为其中一个成员函数必须具有返回类型。(void如果您没有返回任何内容)。其次,foo是一个对象函数,这意味着只能使用C2类型的对象调用它。