1. ホーム
  2. c++

クラス変数:パブリックアクセスはリードオンリーだが、プライベートアクセスはリード/ライト

2023-08-14 14:54:24

質問

おっと、今のところそのソケットライブラリには取り組んでいません。C++でもう少し教育しようと思っています。

クラスで、ある変数を一般には読み取り専用で、個人的にアクセスするときは読み取り+書き込みにする方法はありますか? 例えばこんな感じです。

class myClass {
    private:
    int x; // this could be any type, hypothetically

    public:
    void f() {
        x = 10; // this is OK
    }
}

int main() {
    myClass temp;

    // I want this, but with private: it's not allowed
    cout << temp.x << endl;


    // this is what I want:

    // this to be allowed
    temp.f(); // this sets x...

    // this to be allowed
    int myint = temp.x;

    // this NOT to be allowed
    temp.x = myint;
}

私の質問は、凝縮されたもので、どのようにすれば x の中から f() の中で、それ以外の場所からは読み取り専用でアクセスできます。 int newint = temp.x; は許可されているが temp.x = 5; は許されないのですか? const 変数のように、しかし f() ...

EDIT: 大きなベクターインスタンスを返す予定であることを言及するのを忘れていましたが、getX()関数を使用するとそのコピーを作成するだけで、実際には最適ではありません。私はそれへのポインタを返すことができましたが、それは悪い習慣です。

追伸:もし私が基本的にポインターの知識を示したいだけで、それが完全かどうかを尋ねたい場合、どこに投稿すればよいでしょうか?ありがとうございます。

どのように解決するのですか?

もちろん、できます。

class MyClass
{
    int x_;

public:
    int x() const { return x_; }
};

コピーを取りたくない場合(整数の場合、オーバーヘッドはありません)、次のようにします。

class MyClass
{
    std::vector<double> v_;

public:
    decltype(v)& v() const { return v_; }
};

またはC++98で

class MyClass
{
    std::vector<double> v_;

public:
    const std::vector<double>& v() const { return v_; }
};

これはコピーを作成しない。これは への参照を返します。 .