可以检查(例如通过gcc)哪些方法或成员可以被移动到受保护或私有部分?确定方法或成员是否可以被保护或私有
回答
考虑下面的代码部分:
class foo{
protected:
void foo_method_1(){};
int foo_member_var;
};
class bar : public foo{
void bar_method_1(){
foo_method_1();
}
};
如果要确定哪些成员和Foo类的方法可以是私有的,你必须对所有这些移动到私人部分。因此,它看起来就像这样:
class foo{
private:
void foo_method_1(){};
int foo_member_var;
};
...
现在,它不会编译,这里的海湾合作委员会抛出的第一个错误:
prog.cpp:5:8: error: 'void foo::foo_method_1()' is private
void foo_method_1(){};
从你知道,你必须将foo_method_1移到受保护部分。所以它看起来像这样:
class foo{
private:
int foo_member_var;
protected:
void foo_method_1(){};
};
...
现在它会编译。您必须为班级中的每一种方法和成员重复此过程。对于公共部分,您可以按照上述相同的方式进行操作。
我知道这种方法,但它很耗时。 – Marcin
@marcin不幸的是。为了加速它,你可以像这样编译你的代码:'gcc -o foo bar.cpp 2> errors'然后'cat errors | grep“是私有的”。你将得到一个不能私有的函数列表。然后你可以一次把所有的人移动到受保护的位置。 –
您不能以编程方式执行此操作,否。 这实际上是一件好事。
当然,你可以创建一个工具,用C++解析器集成,然后—一个接一个—取得了一定的会员功能private
留下任何那里,没有引起你的程序中的错误。
但是,为了做到这一点,您的整个程序需要对该工具可见。也许如果你有一个简单的项目,这不是一个问题,但如果你正在编写一个字面上不可能的库。
即使你能做到这一点,你最终的班级设计将是一个绝对的混乱。 只有人类程序员知道API的哪些部分是为公共消费而设计的,而不是,并且这与API的哪些部分是当前正在消费并不总是相同。
坚持手动的方式,但不要复制机器的方式,随机猜测什么是编译和什么不编译。用你的大脑和你对这个班级应该做什么的记忆,来确定哪些功能应该是public
,哪些不应该。
理想情况下,在您首次设计您的课程时试图让它正确!你应该花更多的时间来设计你的程序,而不是实际编程它,否则你很快就会得到这样的维护噩梦。
否。编译器会看到您的代码,而不是您的设计。
- 1. 注释或其方法是否可以使用私有,默认或受保护的访问修饰符?
- 2. 函数或方法或函数成员或方法成员?
- 3. 私有成员没有被Java中的子类继承(或可以覆盖)?
- 4. 将私有或受保护的方法转换为公开
- 5. ejabberd:有没有一种方法可以确定用户是否是管理员?
- 6. 确保私有/受保护方法的输入?
- 7. 访问轨私人/保护方法通过JavaScript或jQuery的
- 8. 受保护的和私有的方法
- 9. 将私有方法更改为受保护或包私有单元测试 - 好还是不好?
- 10. 有没有办法以编程方式确定私钥是否在DER或PEM中编码?
- 11. 具有所有私人成员的课程是否可以成为POD课程?
- 12. 私人会员不会被继承或只是无法访问?
- 13. 有什么方法可以确定它是否是测试(.NET)?
- 14. 有无论如何定义公共或私人或受保护的类在PHP
- 15. 为什么要调用受保护的或私有的CSharp方法/变量?
- 16. 是否可以同步数据成员而不是方法?
- 17. C++:允许访问受保护的类的成员,而不是私人成员
- 18. 是否可以拥有财产,可以是或虚假或数组或空
- 19. 将私有方法更改为受保护以进行测试
- 20. 暴露成员或使它们在Python中是私有的?
- 21. 推荐在javascript模块中确定私人成员的方法
- 22. 不能访问私有保护成员的迭代器PHP
- 23. C++继承中的保护和私有成员变量
- 24. Java通过受保护的getter访问私有超类成员
- 25. javadoc所有 - 私人,公共和受保护的成员
- 26. 当在C#或Java中进行子类化时,是否可以重写私有成员?
- 27. 是否有启发式来确定方法或字段是否属于类中?
- 28. 有什么方法可以确定iPhone是否在漫游?
- 29. PHP/Magento:是否可以编辑对象中的“受保护”成员?
- 30. 可以wicked_pdf或wkhtmltopdf生成受保护的pdf吗?
您可以将它们全部移至私有,然后检查编译器引发的错误。然后,根据错误信息,您可以将它们逐一移动到受保护的位置,以便派生类可以访问它们。 –
你的意思是说,公共API的哪些方法是未使用的(因此可以变成私有的)? – Niall
它应该是指示哪种方法应该公开的API。 – Jarod42