3

データのコピーを減らすために、メンバーデータポインタを作成する必要があります。サンプルコードをいくつか記述しました。「エラー」とマークしたところにエラーが発生しました。正しく行う方法。

#include <iostream>

class A {
public:
    A() {
        stra="12345";
    }
    virtual ~A() {}
    string stra;
}

class B {
public:
    B(A *pt) {
        strb=&(pt->stra);  //Error.An assignment statement
    }
    virtual ~B() {}
    string A::*strb;       //member data pointer from class A
}

int main() {
    A ma;
    B mb(&ma);
    std::cout<< *(mb.strb) <<std::endl;  //Error.print data
}
4

2 に答える 2

2

実際、あなたが持っているのは標準のポインターであり、メンバーへのポインターではありません。以下が機能します。

#include <iostream>
#include <string>

using namespace std;


class A {
public:
    A() {
        stra="12345";
    }
    virtual ~A() {}
    string stra;
};

class B {
public:
    B(A *pt) {
        strb=&(pt->stra);
    }
    virtual ~B() {}
    string* strb; // <<<<<<<< THIS
};

int main() {
    A ma;
    B mb(&ma);
    std::cout<< *(mb.strb) <<std::endl;
}

データメンバーへのポインタに関する説明については、C ++:クラスデータメンバーへのポインタを参照してください。

これでどこに行くのかわかりませんが、あるクラスのインスタンスに別のクラスのインスタンス内のものへのポインターを保持させると、かなり貧弱な設計になります。

于 2012-12-01T08:22:06.153 に答える
0

string A::*strb;する必要がありますstring* strb;

Bには、A文字列(?)へのポインタではなく、文字列オブジェクトへのポインタが必要です。

于 2012-12-01T08:22:29.580 に答える