2012-03-16 3 views
0

Я работал с количеством одиночных классов в C++ (для класса), а теперь для проекта некласса, я пытаюсь использовать унаследованные классы.Смутно о конструкторских цепочках в C++

По какой-то причине я очень толстый о цепях конструктора.

Рассмотрим следующий пример:

class SuperClass 
{ 
    string privateKey; 
    string publicKey; 
    string name; 

public: 
    enum Key {PUBLIC, PRIVATE}; 
    SuperClass(Key, string); 
}; 

SuperClass::SuperClass(Key key, string theKey) 
{ 
    switch(key) 
    { 
     case PUBLIC: publicKey = theKey; 
        break; 
     case PRIVATE: privateKey = theKey; 
        break; 
    } 
} 


class SubClass : private SuperClass 
{ 
public: 
    SubClass(string key); 
}; 

SubClass::SubClass(string key) 
: SuperClass(SuperClass::PUBLIC, key) // "SubClass" will only interact with the public key, in this case. 
{ 
    cout << "I'm instantiated!" << endl; 
} 

int main() 
{ 
    SubClass example ("thisIsThePublicKey"); 
    return 0; 
} 

При компиляции, я получаю следующее сообщение об ошибке:

error: no matching function ncall to SuperClass::SuperClass() 
note: candidates are: SuperClass::SuperClass(SuperClass::Key, std::string) 

Почему я получаю это? Разве я не использовал конструктор, который говорит, что это кандидат? Я чувствую, что прочитал каждый учебник по цепочкам конструктора, и я до сих пор не понимаю, что я должен делать по-другому.

Спасибо за помощь!

+2

Просмотрите код в вопросе или лучше упростите действительный код и опубликуйте его напрямую. В преобразовании вы не добавили отношения наследования, и модифицированный код не должен показывать поведение, о котором вы говорите. –

+0

-1 и проголосовали за закрытие. Приведенный здесь код не показывает проблему, указанную в вопросе, и принятый ответ не имеет отношения к реальной проблеме, что бы это ни было. –

ответ

1

Я считаю, что вы забыли наследовать от вашего супер класса:

class SubClass 

Должен быть:

class SubClass : public SuperClass 
+0

Извините, это была плохая транскрипция. Мой фактический код читает: «class SubClass: private SuperClass» ... изменение выше, чтобы отразить.У меня есть ли он для частного доступа, поэтому он может получить доступ к «privateKey» и «publicKey» --- shoudl. Я не сделал этого? Возможно, я не понимаю, как private/public работает в контексте наследования. –

+1

@TomThorogood с 'private SuperClass', который он компилирует для меня: http://ideone.com/d2XUR –

+0

Хотя, чтобы быть справедливым, сообщение об ошибке, которое вы получаете, конечно, кажется немного подозрительным, потому что это была проблема, кроме этого ваша код выглядит хорошо для меня и на самом деле компилируется здесь. Вы уверены, что у вас нет других ошибок в транскрипции, т.е. полезный? –

0

Прежде всего, я не могу видеть в своем определении подкласса, где указать наследование. Это должно быть что-то подобное для открытого наследования:

class SubClass : public SuperClass 
{ 
// definition 
} 
0

Вы должны наследовать от SuperClass:

class SubClass : public SuperClass 
{ 
public: 
    SubClass(string key); 
}; 

Ваш пример компилирует также хорошо, если я использую личное наследство.

3

Я не думаю, что вы разместили для своего примера весь соответствующий код, поскольку приведенный выше код компилируется для меня с g ++.

При этом, однако, я могу догадаться из сообщения об ошибке, Подкласс имеет конструктор по умолчанию в нем где-то, или какой-то другой второй конструктор, который вы не публикуемую в вашем примере все же, определенный что-то вроде этого:

SubClass::SubClass() // No argument constructor 
{ 
    cout << "Default constructor (no initialization)." << endl; 
} 

Это неявно попытается вызвать конструктор по умолчанию SuperClass :: SuperClass(). Обычно C++ создаст для вас конструктор по умолчанию, если вы вообще не создадите никаких конструкторов. Однако, поскольку вы определили конструктор, который принимает параметры для SuperClass, C++ не будет генерировать для него конструктор по умолчанию.

Другая возможность: вы создали другой подкласс SuperClass без конструкторов, и, таким образом, C++ генерирует неявный конструктор по умолчанию. Однако созданный неявный конструктор C++ не может найти конструктор SuperClass по умолчанию для вызова.