我有一个类,它有一些访问器方法,可以在类之外用于查看它的一些私有数据。
但是,类的内部方法不应使用这些公共访问器,因为类的内部状态由其他方法更改,并且在计算完成之前,这些更改不会写入公共访问者查看的位置。 / p>
是否存在阻止类调用其自己的一个或多个成员的编译时方法?或者,使用assert
进行运行时检查很好,因为它可以很容易地用于发布编译。
答案 0 :(得分:2)
虽然我在实践中从未见过这种模式,但您可以将实现和界面分开(尽管通常是相反的方式)
namespace detail {
class Impl {
protected:
Impl() : x_(0) {}
int x_;
void internal() { x_ = 1; }
void something_else() { x_ = 2; }
};
}
class Interface : public detail::Impl {
public:
int x() const { return x_; }
void x(int x) { x_ = x; }
};
或者在没有推导的情况下更进一步:
class Interface;
namespace detail {
class Impl {
private:
friend class ::Interface;
Impl() : x_(0) {}
int x_;
void internal() { x_ = 1; }
void something_else() { x_ = 2; }
};
}
class Interface {
public:
int x() const { return impl_.x_; }
void x(int x) { impl_.x_ = x; }
private:
Impl impl_;
};
还查找PIMPL惯用法,它通常用于减少头/库/客户端耦合并增加编译时间。
答案 1 :(得分:0)
这是我的建议,对于使用断言的调试构建:
IncrementInternalCallCount
的简单函数或宏。这将增加类中的调用计数。为此,在课堂上只有一个计数器变量。把这些东西仅用于调试/诊断目的。为此,您可以使用一些RAII类,它会增加计数器,并在函数退出时减少计数器。因此,您需要在每个函数的开头放置一个RAII对象。析构函数将自动调用。这也将允许从其他类函数调用所有非getter函数。
极少的代码(严格来说不是C ++):
class CYourClass
{
int Counter = 0; // Not C++ syntax
IncrementCallCounter() { Counter++;}
DecrementCallCounter() { Counter++;}
CheckCounterStatus() { if(Counter>0) ASSERT;}
private:
void InternalFun()
{
IncrementCallCounter();
// Do work, call anything
DecrementCallCounter();
}
public:
int Getter1()
{
CheckCounterStatus();
}
};