2012-07-10 2 views
5

가능한 중복 :
Why is it an error to use an empty set of brackets to call a constructor with no arguments?C++ 상속 오류

나는 작은 코드 샘플이 : 나는 변경하는 경우에는

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 

    void print() 
    { 
    cout << "Hello" << endl; 
    } 

}; 

class B: public A 
{ 

    public: 

    B() { cout << "Creating B" << endl;} 

}; 


int main() 
{ 

    B b(); 

    b.print(); // error: request for member ‘print’ in ‘b’, which is of non-class type ‘B()()’ 



} 

을 아래 하나, 작동하는 경우

B* b = new B(); 

b->print(); 

스택에 개체를 할당 할 때 왜 작동하지 않습니까?

답변

9

B b();b이라는 함수를 선언하므로 B을 반환합니다. 그냥 B b;을 사용하고 C++에는 이런 종류의 구문을 까다롭게 만드는 복잡한 문법이 있다는 사실을 비난하십시오.

4

B b();은 아무 것도 취하지 않고 B을 반환하는 b이라는 함수를 선언합니다. 놀라운? B 클래스의 이름을 Int으로 변경하고 "개체"이름을 f으로 변경하십시오. 이제 외모는

Int f(); 

처럼 보입니다.

기본-구성 객체를 정의하려면, 다음이 필요합니다

operator new의 경우
B b; 

, 기본 생성자 또는 괄호없이 호출 할 수 있습니다

B* b = new B; 
B* b = new B();