我正在使用带有clang的C++ 14 MacOS Sierra.我想按设计强制执行规则.以下是规则.
我班上有一个成员变量说:
unsigned int m_important_num;
Run Code Online (Sandbox Code Playgroud)
我班有四种方法.
fun1();
fun2();
fun3();
fun4();
Run Code Online (Sandbox Code Playgroud)
目标:
我只fun2()希望能够改变它的值m_important_num.
问题:
如果除了fun2()更改变量之外的任何方法,是否可能使编译器出错?一种可能的方法是声明const以某种方式授权fun2()改变const变量?这是一个好的解决方案吗?或者他们是更好的解决方案?
次要问题:
尝试做这样的事情是错误的设计吗?
Jar*_*d42 10
排序,附加层:
class S1 {
public:
void fun2() { /*Modify m_important_num */ }
unsigned int getImportantNum() const { return m_important_num;}
private:
unsigned int m_important_num;
};
class S2 : private S1
{
public:
void fun1();
using S1::fun2; // or void fun2() {S1::fun2();}
void fun3();
void fun4();
};
Run Code Online (Sandbox Code Playgroud)
正如Yakk评论的那样,如果func2需要访问S2成员,CRTP可以解决这个问题:
template <typename Derived>
class S1 {
public:
void fun2() { asDerived().foo3(); /*Modify m_important_num */ }
unsigned int getImportantNum() const { return m_important_num;}
private:
Derived& asDerived() { return stataic_cast<Derived&>(*this); }
private:
unsigned int m_important_num;
};
class S2 : private S1<S2>
{
// friend class S1<S2>; // If required.
public:
void fun1();
using S1::fun2; // or void fun2() {S1::fun2();}
void fun3();
void fun4();
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
977 次 |
| 最近记录: |