1

私は C# を少し学び、今は C++ を学んでいます。C# では、get 演算子と set 演算子を使用してデータの隠蔽を行うことができます。この方法では、データ メンバーを "get" を提供することで "読み取り専用" として表示できますが、"set" を提供することはできません。

これにより、クラス (Person) に別のクラス (Account) を含めることができるようになり、Person.Account のユーザーが Account クラスのパブリック関数を使用できるようになりますが、ユーザーは Account クラスを直接変更することはできません。それだけ。

これは、以下のコード サンプルでより明確になります。

私の質問は、C++ は気の利いた get/set 構文を提供しないため、以下のコードに類似した C++ はありますか?

using System;

class Person
{
    private string _Name;
    public string Name { get { return _Name; } set { _Name = value; } }

    private Account _Account;
    public Account Account { get { return _Account; } }

    public Person()
    {
        _Name = "";
        _Account = new Account();
    }
}

class Account
{
    private decimal _Balance;
    public decimal Balance { get { return _Balance; } }

    public Account()
    {
        _Balance = 0;
    }
    public void Deposit(decimal deposit)
    {
        _Balance += deposit;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Name = "John Doe";

        // not allowed: p.Account = new Account();
        // Property or indexer 'CSharp.Person.Account' cannot be assigned to -- it is read only

        // allowed: the Account Object's public functions are available
        p.Account.Deposit(1000);

        Console.WriteLine(p.Account.Balance.ToString());
        // console says "1000"
    }
}
4

4 に答える 4

3

これらの特別なメンバーは、C# の用語では "プロパティ" と呼ばれ、C++ にはそれらに直接相当するものはありません。メンバーをパブリックにすることも、プライベートにすることもできます。また、ゲッター メソッドとセッター メソッドを定義することもできますが、C# のシンタックス シュガーがないため、明示的に呼び出す必要があります。

実際、この動作を C++ でコーディングすることは可能ですが、ここで詳しく説明されているように、見苦しいです: http://www.cplusplus.com/forum/general/8147/

于 2013-11-09T00:57:06.583 に答える
2

この 2 つの言語には根本的な断絶があります。あなたは、アカウントを読み取り専用にしたいと言いますが、それに対して変更関数 ( Deposit) を呼び出します。私のC++有線脳は、これはgobbledygookだと言っています。しかしもちろん、これは言語の違いによるものです。割り当ては、2 つの言語でまったく異なる意味を持ちます。C++ では、これは単なる別の変更操作です。C# では、別のオブジェクトを指すように参照を再割り当てしています。(と思いますが、実際には C# を使用していないため、間違っている可能性があります)。

さて、私はここから離れているかもしれませんが、この特定のケースではこの機能は実際には必要ないことをお勧めします. それが持つ唯一の利点は、Person.Account一意に参照されるオブジェクトを維持することだと私には思えます。したがって、2 つのPersonオブジェクトが同じオブジェクトを共有することはありませんAccount。ただし、これは C++ では必要ありません。変数はオブジェクトです。機能を使用して明示的に (参照、ポインター、またはスマート ポインターを使用して) 共有しない限り、それらは共有されません。したがって、ここで本当に必要なのは、単なる public メンバーです。

本当に割り当てを禁止したい場合は、それを行うことができます。の代入演算子を削除するだけですAccount。または、C++11 より前では、非公開として宣言し、実装を提供しません。

私がここにいない場合、これで何を達成しようとしているのか、もっと明確にできますか? 繰り返しになりますが、(C++ では) 読み取り専用オブジェクトが必要なのに、それを変更したい (これは の呼び出しで行っている) と言うのは意味がありませんDeposit。バランスメンバーを作る可能性を無視してmutableいますが、それはこの場合には適切ではないようです.

于 2013-11-09T01:08:55.773 に答える
1

C++ には直接同等のものはないようです。プロパティのようなものを念頭に置いて作成されたわけではありませんが、C# は Java が既に実装していたためです。しかし、あなたと同じように、私はそれが可能かどうかを知りたくて、この小さな宝石に出くわしました. 基本的には、それは必要な変数を返すメソッドであり、それを const に設定して、一度取得すると変更できないようにし、そのメソッドを使用してのみ効果的に読み取るようにします。アクセスします。したがって、必要に応じてそのようなものを使用できます。実際、考えてみると、「プロパティ」、または「ゲッターとセッター」は、実際にはリンクにあるものの実装にすぎません。セッターには、ローカル変数を必要な値に設定するパラメーターがあります。

于 2013-11-09T01:24:52.277 に答える