2016-05-17 74 views
2

可以检查(例如通过gcc)哪些方法或成员可以被移动到受保护或私有部分?确定方法或成员是否可以被保护或私有

+1

您可以将它们全部移至私有,然后检查编译器引发的错误。然后,根据错误信息,您可以将它们逐一移动到受保护的位置,以便派生类可以访问它们。 –

+0

你的意思是说,公共API的哪些方法是未使用的(因此可以变成私有的)? – Niall

+1

它应该是指示哪种方法应该公开的API。 – Jarod42

回答

2

考虑下面的代码部分:

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(){}; 
}; 
... 

现在它会编译。您必须为班级中的每一种方法和成员重复此过程。对于公共部分,您可以按照上述相同的方式进行操作。

+0

我知道这种方法,但它很耗时。 – Marcin

+2

@marcin不幸的是。为了加速它,你可以像这样编译你的代码:'gcc -o foo bar.cpp 2> errors'然后'cat errors | grep“是私有的”。你将得到一个不能私有的函数列表。然后你可以一次把所有的人移动到受保护的位置。 –

2

您不能以编程方式执行此操作,否。 这实际上是一件好事。

当然,你可以创建一个工具,用C++解析器集成,然后—一个接一个—取得了一定的会员功能private留下任何那里,没有引起你的程序中的错误。

但是,为了做到这一点,您的整个程序需要对该工具可见。也许如果你有一个简单的项目,这不是一个问题,但如果你正在编写一个字面上不可能的库

即使你能做到这一点,你最终的班级设计将是一个绝对的混乱。 只有人类程序员知道API的哪些部分是为公共消费而设计的,而不是,并且这与API的哪些部分是当前正在消费并不总是相同。

坚持手动的方式,但不要复制机器的方式,随机猜测什么是编译和什么不编译。用你的大脑和你对这个班级应该做什么的记忆,来确定哪些功能应该是public,哪些不应该。

理想情况下,在您首次设计您的课程时试图让它正确!你应该花更多的时间来设计你的程序,而不是实际编程它,否则你很快就会得到这样的维护噩梦。

1

否。编译器会看到您的代码,而不是您的设计

相关问题