2017-12-03 32 views
2

2 개의 ctors가있는 일부 오디오 형식에 대한 추상 의사 기본 클래스가 있습니다. 하나는 파생 클래스에서 작동하지만 다른 하나는 해결할 수없는 오류를 제공합니다. MP3로 선언 된 보호 된 멤버에 액세스 할 수 없지만 하나의 ctor에 연결할 수는 있지만 다른 사람에게는 연결할 수없는 이유는 무엇입니까?파생 클래스에서 가상 기본 클래스의 protected ctor를 사용합니다.

class Audioformat 
{ 
protected: 
    string song=""; 
    Audioformat(string s) :song(s) {};//This ctor gives me the error 
    Audioformat() { song = "unknown";} 
public: 
    virtual void play()=0; 
    virtual void info() = 0; 
    virtual ~Audioformat() = 0 {}; 
}; 
class MP3 : public Audioformat 
{ 
public: 
    using Audioformat::Audioformat; 
    void play() { cout << "pseudo-play" << endl; } 
    void info() { cout << song << endl; } 
    ~MP3() { cout << "MP3" << endl; delete this; } 
}; 

Here's 내 주요 :

int main() 
{ 

    MP3 song1{};//WORKS 
    MP3 song2{ "random trash song" };//ERROR MP3::MP3(std::string) is inaccessible 
    play(song1); 
    info(song1); 
    getchar(); 
    return 0; 
} 
+1

OT : '이것을 지워 라, 무엇? –

+1

'delete this'는 'MP3'의 모든 인스턴스가 new (예 : 생성자를 비공개로 만들고 정적 생성자 함수를 추가하는 등)로 생성 된 경우에만 작동합니다. 그리고 심지어 소멸자로부터 절대 호출해서는 안됩니다. 왜냐하면 그것은 분명히 무한 재귀를 생성하기 때문입니다. 그러나 'MP3'라는 클래스에서는 합리적인 유스 케이스를 상상할 수 없습니다. 이벤트 관리 시스템의 경우보다 일반적입니다. –

+0

아,'string song = "";;은 필요 없습니다. 이것은 Java가 아닙니다. 그것을'std :: string song;'으로 만드십시오. –

답변

4

두 가지 이유 :

  1. 특별한 클래스 멤버의 암시 적 선언을 억제하지 않는 단독 선언을 사용. 이 경우 기본 c'tor ([namespace.udecl]/4) :

    은 Using 선언 자체에 의해 파생 된 클래스 멤버의 암시 선언을 억제하지 않습니다

    그래서 공공 기본 c'tor에 대한 MP3은 컴파일러에 의해 합성되어 사용자의 예제에서 호출됩니다. 사용 선언에 의해 도입

  2. c'tors는 기본적으로 그들이 기본 클래스에 있던 같은 접근성 ([namespace.udecl]/19)이 : 생성자 는 동의어를 생성하지 않습니다 이름

    사용하여 A-선언자를; 대신, 해당 기본 클래스의 개체를 생성 할 때 액세스 할 수있는 경우 추가 생성자는 이고 액세스 선언은 무시됩니다 ( ). 이뿐만 아니라 MP3 보호 이후

    그래서 문자열을 복용 c'tor는 main에 액세스 할 수 없습니다.

당신이 가지고 std::string 전액을 정의 받아 그 MP3에 공개 c'tor 있고, 명시 적으로 기본 클래스 c'tor에 전달하려는 경우

public: 
    MP3(std::string s) : Audioformat(s) {} 
+0

그래서 나는이 MP3 (string s)와 같은 것을해야만한다 : 노래는 노래하지만 노래는 비 정적이어서 작동하지 않는다. – BMAY

+0

@BMAY - 당신이해야 할 일을 정확하게 기록했습니다. 추측 할 필요가 없으며 잘못 이해할 필요가 없습니다. – StoryTeller

+0

오 죄송합니다 - 내 웹 사이트가 제대로 다시로드되지 않았습니다. - 고맙습니다. – BMAY