答えは、あなたは何らかのゲッターなしでこれを行うことはできません。しかし、ゲッターを再利用できるようにすることができ、括弧なしでフィールドワークの簡単な構文(ほとんど)を作ることができます。
(C++ 11必須)
template<typename Friend, typename FieldType>
class crazyconst
{
FieldType value;
friend Friend;
FieldType& operator=(const FieldType& newValue) { return value = newValue; }
public:
operator FieldType(void) const { return value; }
FieldType operator()(void) const { return value; }
};
class A
{
public:
crazyconst<A, int> x;
void doStuff()
{
// Gettin' stuff done
x = 5; // OK
}
};
int main(int argc, char** argv)
{
A a;
int b = a.x;
int c = a.x(); // also works
}
C++ 03バージョン:http://ideone.com/8T1Po
しかし、注意してくださいが、これはコンパイルが、期待通りに動作しません。
const int& the_x = a.x;
a.doStuff();
std::cout << the_x;
OTOH、これはうまくいくはずです:
const auto& ref_x = a.x;
a.doStuff();
std::cout << ref_x;
'main'の' y = a.x' intが合法であるべきことを意味しますか?そうであれば、そう言いましょう。そうでなければ、「プライベート」を使用するなど、多くの答えが得られるからです。 – vsz
私はいくつかの奇妙な言語は、C/C++ではなく、そのようなことをしていると思います。 –
はpublic int xMethod(){return x;}を持ち、xはプライベートメンバーです。 – Dhananjay