5

私はアプリケーションの問題の1つに取り組んでいます。ここで私が直面している問題は、クラス オブジェクトのポインターを使用して呼び出す必要がある関数がいくつかあることです。

しかし、主な問題は、クラスポインターを持っていないことです。代わりに、メンバー変数の値(値のリストとしましょう)があります。これに続いて、以下のコードで小さなテストを行いました。

using namespace std;

class Person {
public:
      Person(string name, int age) {
            this->name = name;
            this->age = age;
      }
      string getName() {
            return name;
      }
      int getAge() {
            return age;
      }
      void Print()
      {
      printf("This address is %x\n",this);
      printf("age adress is %x\n",&age);

      }
private:
      int age;
      string name;

};

int main() {
      cout << "Creating a person..." << endl;

Person *johnDoe=new Person("John Doe", 25);
      cout << "Person's name: " << johnDoe->getName() << endl;
      cout << "Person's age: " << johnDoe->getAge() << endl;
      johnDoe->Print();
      delete johnDoe;
      return 0;
}

実行の coutput は次のとおりです。

> ./a.out
Creating a person...
Person's name: John Doe
Person's age: 25
This address is 72918
age adress is 72918

今、私の疑問は次のとおりです。

クラスメンバー変数のアドレスが常にオブジェクトのアドレスを指していることが保証されていますか? 他のコア API 関数を呼び出すためにポインターを使用する必要がある場合、このアドレスを使用できますか?

ググったらこれ見た?

(C1x §6.7.2.1.13: 「適切に変換された構造体オブジェクトへのポインターは、その最初のメンバーを指します...またその逆も同様です。構造体オブジェクトとして内部に名前のないパディングがある場合がありますが、その先頭にはありません。」)

これは、C ++とクラスの場合でも当てはまりますか?

4

2 に答える 2

8

クラスメンバー変数のアドレスが常にオブジェクトのアドレスを指していることが保証されていますか?

いいえ。C++ では、最初のメンバーの前に何かが存在する可能性があります (特に、派生クラスとポリモーフィック クラスの場合)。正確には、実装が定義されています。

他のコア API 関数を呼び出すためにポインターを使用する必要がある場合、このアドレスを使用できますか?

いいえ、その必要はありません。メンバーにアクセスできるときはいつでも、 にもアクセスできますthis。いいえ?

于 2012-07-23T06:59:57.170 に答える
1

これは、仮想関数を持たないクラスにも当てはまります。また、継承がある場合は注意する必要があります (ルールがどの程度正確かはわかりません)。

一般的に、これは悪い考えです。なぜそれをしたいのですか?あなたはクラスの構造に依存しており (つまり、age の前に誤ってメンバーを追加すると、コードが壊れます)、カプセル化を放棄します (それは非公開であるため、他のクラスは age へのポインターを持つべきではありません。オブジェクト表現)。

ところで: あなたは Java プログラマーですか? オブジェクトを正しく初期化していないため、コンストラクターはあなたのように見えます。次のようにする必要があります。

Person(String n, int a) : age(a), name(s) {}

(そうしないと、コンパイラは最初に int と string のデフォルトのコンストラクターを呼び出し、次にそれらに対して operator= を呼び出します - これは効率的ではありません)。

于 2012-07-23T07:05:50.770 に答える