0

main()で、TheBuilderというクラスからBOBというオブジェクトポインタを作成するとします。これは次のように行います。

TheBuilder *BOB = new TheBuilder();

ここで、これをmain内のhelloWorldという関数に渡したいとしましょう。このBOBポインターをTheBuilderオブジェクトに渡すにはどうすればよいですか?どうすればそれを呼び出すことができ、helloWorld()のパラメータリストはどのようになりますか?

BOBがメンバー関数helloWorld内で指しているオブジェクト内のデータを変更できるようにしたい。

おそらく「*」または「&」があることは知っていますが、どこに置くかわかりません。

ありがとう

4

5 に答える 5

2
int main()
{
    TheBuilder *BOB = new TheBuilder();
    helloWorld(BOB);
    if (BOB->canWeBuildIt)
        printf("yes we can!");
    delete BOB;
    return 0;
}

void helloWorld(TheBuilder *bob)
{
    bob->canWeBuildIt = true;
}
于 2012-04-21T05:04:06.080 に答える
0
void doSomething1(int x){ 
  //code 
} 

これは変数を値で渡します。関数内で何が起こっても、元の変数は変更されません

void doSomething2(int *x){ 
  //code 
} 

ここでは、ポインタ型の変数を整数に渡します。したがって、番号にアクセスするときは、値に* xを使用するか、アドレスにxを使用する必要があります

void doSomething3(int &x){ 
  //code 
} 

これは最初のものと似ていますが、関数内で何が起こっても、元の変数も変更されます

だからあなたの場合、あなたは書くでしょう

void helloWorld (TheBuilder* object){
    //Do stuff with BOB
}

void main (){
    TheBuilder *BOB = new TheBuilder();
    helloWorld (BOB);
}
于 2012-04-21T04:55:48.557 に答える
0

パラメータリストにはTheBuilder *パラメータが含まれます。例えば:

void helloWorld(TheBuilder *theBuilder) { ... }

そしてそれを呼ぶために:

helloWorld(BOB);

于 2012-04-21T04:56:25.193 に答える
0
class TheBuilder
{
    <class def>
}

void helloWorld (TheBuilder* obj)
{
    <do stuff to obj, which points at BOB>;
}

int main ()
{
    TheBuilder *BOB = new TheBuilder();
    helloWorld (BOB);
    return 0;
}
于 2012-04-21T04:59:11.783 に答える
0

がメンバー関数の場合helloWorld、オブジェクトポインタを渡す必要はありません。thisメンバー関数を呼び出したオブジェクトを指す、と呼ばれる暗黙のポインタがあります。

#include <iostream>

class TheBuilder
{
  public:
    void helloWorld();

    std::string name_;
};

void TheBuilder::helloWorld()
{
    //Here, you can use "this" to refer to the object on which
    //"helloWorld" is invoked

    std::cout << this->name_ << " says hi!\n";

    //In fact, you can even omit the "this" and directly use member variables
    //and member functions

    std::cout << name << " says hi!\n";
}

int main()
{
    TheBuilder alice; //constructs an object TheBuilder named alice
    alice.name_ = "Alice";

    TheBuilder bob; //constructs an object TheBuilder named bob
    bob.name_ = "Bob";

    alice.helloWorld(); //In helloWorld, "this" points to alice
                        //prints "Alice says hi!"

    bob.helloWorld(); //In helloWorld, "this" points to bob
                      //prints "Bob says hi!"
}

実際、メンバー関数は、操作対象のオブジェクトに対応する暗黙的なパラメーターを持つフリー関数とほとんど同じです。次のコードを書くとき:

struct MyClass
{
    int myMemberFunction() {...}
};

MyClass obj;
obj.myMemberFunction();

コンパイラによって生成されるコードは、次のものと同等です。

int myMemberFunction(MyClass * this) {...}

MyClass obj;
myMemberFunction(&obj);

しかし、あなたはそれについて気にする必要はありません。理解する必要があるのは、メンバー関数(オブジェクト指向用語のメソッド)がオブジェクトで呼び出され、呼び出されたオブジェクトを操作することです(たとえば、メンバー変数(フィールド)を変更できます)。メンバー関数では、名前を直接使用して現在のオブジェクトメンバーにアクセスするか、明示的にthisポインターを使用して現在のオブジェクトメンバーにアクセスできます。

于 2012-04-21T10:10:56.113 に答える