0

クラスメソッド/プロパティ構成に関して、public、private、protectedの継承の違いを理解しています。ただし、私の質問は、特にnullで終了する文字列へのポインタに関連しています。

class MyClass
{
   private: 
      char * SomeValue;

   ...
   ...
}

ここで、処理のどこかで、MyClass-> SomeValueが割り当てられ、文字列値が入力されます。問題ない。ここで、「MyClass」オブジェクトのインスタンスが作成され、これからの文字列値が必要な呼び出し元が必要です。C ++はポインタやポインタへのポインタなどで多くのダメージを与える可能性があるため、ポインタの場所を割り当てられた文字列に戻したいのですが、誰にも値を変更させたくありません。このデフォルトは、コンパイラとメモリ管理の内部で制御されていますか?誰もがこのクラスを主に内部目的で使用するリスクは低いですが、私の理解はそれだけです。

ありがとう

4

8 に答える 8

3

通常、charsへのconstポインタを返します。誰かが戻り値を非定数にキャストするのを止めることができるものは何もありません。ただし、C++は悪意のあるコーディングから保護するようには設計されていません。

class MyClass {
  char* someValue;
public:
  const char* get_SafeSomeValue() const {
    return someValue;
  }
};
于 2010-11-22T15:42:08.980 に答える
2

いいえ、それはできません。

他の人が提案しているようなことをしたとしても、たとえば次のようになります。

class MyClass {
    char* someValue;
public:
    const char* get_SafeSomeValue() const {
        return someValue;
    }
};

まだ呼び出すことができdelete myClassInstance->get_SafeSomeValue()ます。

于 2010-11-22T15:46:01.330 に答える
1

std::string文字列を格納および転送するためのよりクリーンで安全な方法を提供するのに、なぜC ++で文字列を保持するためにネイキッドポインタを使用するのでしょうか?あなたがしたいことは、別のクラス/関数/メソッドが値を変更することを許可せずに文字列の値を取得することのように聞こえますか?const修飾子としてそれを返すだけです:

const char* foo();
于 2010-11-22T15:43:28.150 に答える
1

次を使用できます。

private:
    const string someValue;
public:
    const string& getReadOnlyValue() { return someValue;};
于 2010-11-22T15:44:29.290 に答える
0

それは可能です-実装するのはOSに依存します。

これらは保護されたメモリページを介して処理されます。複数のメモリページを割り当てて、たとえばに設定できます。「読み取り専用」-すべての書き込みアクセスは例外を除いて失敗します。プログラムによるオーバーヘッドが少し必要です。

WindowsAPIでは、VirtualAllocExは良いスターターです...

于 2010-11-22T15:51:15.933 に答える
0

あなたはこれを行うことができます:

class MyClass
{
   public:
      const char * getValue(); // return a pointer to a const char that can't be modified
   private: 
      char * SomeValue;

   ...
   ...
}
于 2010-11-22T15:42:26.417 に答える
0

ユーザーが指すデータを変更しない場合は、constchar*を返す関数を使用できます。

class MyClass
{
  private:
    char * SomeValue;


  public:
    const char * getSomeValue() const
    {
       return SomeValue;
    }
};

クラスのオブジェクトがコピーされて割り当てられることに注意する必要があります。実用的な目的のために、char*をstd::stringまたはstd::vector<char>に置き換えることができます。失敗すると、次のいずれかが可能になります。

  • コピーコンストラクタと代入演算子をプライベートにし、それらを実装しないでください。
  • 正しく動作するようにそれらをオーバーロードします。
  • boost::noncopyableから派生します。
于 2010-11-22T15:45:16.047 に答える
0

あなたがしたいことは不可能です。c ++には、人々が自分の足を撃つのを防ぐメカニズムはありません。たとえば、誰かがそのポインタでdeleteを呼び出さないようにするにはどうすればよいでしょうか。

于 2010-11-22T15:47:37.917 に答える