Я попробовал Lazy C ++, но он устарел и больше не поддерживается. Он также не поддерживает последний стандарт C ++ 14.
Вот почему я решил написать свой собственный инструмент на Java, используя ANTLR4. Она называется Score, и вы можете найти ее здесь: https://github.com/underrated/Score
. На данный момент она только зарождается и может быть полна ошибок, но я планирую Улучши это. Так что попробуйте, если хотите, и сообщайте о любых ошибках на странице проекта github. Я постараюсь исправить их как можно быстрее.
да, защищенные члены доступны производным классам, но вы обращаетесь к ним в функции main (), которая находится вне иерархии. Если вы объявите метод в классе B и получите доступ к num, все будет в порядке.
Да, защищенные члены доступны производному классу, но только изнутри класса.
пример:
#include <iostream>
class A {
protected:
int num;
};
class B : public A { public:
void printNum(){
std::cout << num << std::endl;
}
};
main () {
B * bclass = new B ();
bclass->printNum();
}
распечатает значение num
, но доступ к num
осуществляется из класса B
. num
должен быть объявлен общедоступным, чтобы иметь к нему доступ как bclass-> num
.
Но вы не получаете доступ к нему из производного класса. Вы получаете доступ к нему из main ().
«Защищенный» означает защищенный от доступа за пределами функции-члена или функции-члена производного класса. «Основная» функция не является членом ни одного класса, но пытается получить прямой доступ к переменной-члену.
Вы видите именно то, что ожидалось. Попробуйте это - http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/ для получения информации о спецификаторах доступа наследования.
При использовании класса на самом деле нет разницы между защищенными и закрытыми членами. Ни один из них недоступен для всего, что использует этот класс.
class A {
private: int privateNum;
protected: int protectedNum;
public: int publicNum;
void SetNumbers(int num) {
privateNum = num; //valid, private member can be accessed in member function
protectedNum = num; //valid, protected member can be accessed in member function
}
};
void main() {
A classA;
classA.privateNum = 1; //compile error can't access private member
classA.protectedNum = 1; //compile error can't access protected member
classA.publicNum = 1; //this is OK
classA.SetNumbers(1); //this sets the members not accessible directly
}
Разница вступает в силу при наследовании от класса с защищенными членами.
class B : public A {
};
Все закрытые члены базового класса по-прежнему являются закрытыми и не будут доступны для производного класса. С другой стороны, защищенные члены доступны унаследованному классу, но по-прежнему недоступны за пределами унаследованного класса.
class B : public A {
public:
void SetBNumbers(int num) {
privateNum = num; //compile error, privateNum can only be accessed by members of A, not B
protectedNum = num; //this works, as protected members can be accessed by A and B
}
};
void main() {
B classB;
classB.publicNum = 1; //valid, inherited public is still public
classB.protectedNum = 1; //compile error, can't access protected member
classB.privateNum = 1; //compile error, B doesn't know that privateNum exists
classB.SetBNumbers(1); //this sets the members not accessible directly
}
Он доступен в рамках функций B, но вы пытаетесь получить к нему доступ в main.