クラス内で上位メンバの値を変更

このQ&Aのポイント
  • クラス内で上位クラス内メンバの値を変更する方法について教えてください。
  • 具体的には、Test1Objクラス内のtest1Valueの値を2に変えたいです。
  • また、コードに問題があれば指摘していただきたいです。
回答を見る
  • ベストアンサー

クラス内で上位クラス内メンバの値を変更

クラス内で上位クラス内メンバの値を変更 test2Objクラス内で test1Objメンバ内のtest1Valueの値を2に変えたい このような事は可能でしょうか? ================================ class Test2Obj{ public: void changeValue(){ //ここでtest1Objメンバ内のtest1Valueの値を2に変えたい } }; class Test1Obj{ public: int test1Value; Test2Obj *test2Obj; //コンストラクタ Test1Obj(int tmp_test1Value){ setTest1Value(tmp_test1Value); test2Obj=new Test2Obj(); } void setTest1Value(int tmp_test1Value){test1Value=tmp_test1Value;} }; int main(void){ Test1Obj *test1Obj=new Test1Obj(1); printf(">>>%d\n",test1Obj->test1Value); //ここでtest1Obj->test1Valueの値を変えたい test1Obj->test2Obj->changeValue(); } ================================ もしコードに問題があればご指摘をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

#include <stdio.h> class Test2Obj; class Test1Obj{ public: int test1Value; Test2Obj *test2Obj; Test1Obj( int tmp_test1Value ); void setTest1Value( int tmp_test1Value ){ test1Value = tmp_test1Value; } }; class Test2Obj{ Test1Obj *owner; public: Test2Obj( Test1Obj *it ) : owner( it ) {} void changeValue(int v){ owner->setTest1Value( v ); } }; Test1Obj::Test1Obj( int tmp_test1Value ){ setTest1Value( tmp_test1Value ); test2Obj = new Test2Obj( this ); } int main(void){ Test1Obj *test1Obj = new Test1Obj( 1 ); printf( ">>>%d\n", test1Obj->test1Value ); test1Obj->test2Obj->changeValue( 2 ); printf( ">>>%d\n", test1Obj->test1Value ); }

kuwezi
質問者

お礼

おお! 凄い。 ちょっと複雑なのになると、クラスを書く順番と 関数を書く順番を注意しないとこんがらがっちゃいそうですね。 C++の奥深さを垣間見ました。 ありがとうございます。

関連するQ&A

  • 派生クラスのメンバを基底クラスの参照に代入(C++

    文末のコードのように、 基底クラスで、派生クラスのメンバの参照を持つのはまずいでしょうか。 (classではなくstructにしているのは質問上でのpublic:の省略のためだけです) 初期化順序的には、基底クラスの参照先は、 基底クラスのコンストラクタが走る時点で初期化されていないので、 コンストラクタ内で参照に対して何かしようとすると問題になると思っています。 基底クラスのコンストラクタ内で派生クラスメンバの参照に対して何かしなければ、 参照は有効で、派生クラスのコンストラクタ実行後であれば 問題なく動くと思ってよいでしょうか。 struct A { int& m_ref; A(int& ref) : m_ref(ref) { } }; struct B : public A { int m_obj; B() : A(m_obj) { } };

  • クラスや構造体のarrayを作りたい。

    クラスや構造体のarrayを作りたい。 クラスや構造体のarrayを作りたいのですが、 以下の方法で正しいのでしょうか? ==================================== #include <string> #include <vector> class Test{ public:   std::string sono1;   int sono2;   bool sono3;   //コンストラクタ   Test(std::string tmp_sono1,int tmp_sono2,bool tmp_sono3){     sono1=tmp_sono1;     sono2=tmp_sono2;     sono3=tmp_sono3;   } }; void main(){   std::vector<Test> testObjArray;   testObjArray.push_back(*(new Test("てすと1",1,true)));   testObjArray.push_back(*(new Test("てすと2",2,false))); } ==================================== 質問1: コンストラクタ時、クラス内の変数へ引数の値を渡す時、 上記のようにtmpを作成する以外の方法はありますか? 質問2: push_back時、クラスをインスタンスしてvectorに渡すにはこのような記述であってるのでしょうか? 「testObjArray.push_back(*(new Test("てすと1",1,true)));」 一応問題なく動いているようなのですが心配です。 よろしくお願いします。

  • クラスがメンバーとしてクラスを持つ時の宣言について

    自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。 class MyClass { public: MyClass(int, int); } class MainClass { private: MyClass myclass(10,10); } このような宣言はできないのでしょうか。 引数なしのコンストラクタは呼び出せているようです。

  • C++ クラスをメンバにもつクラスについて

    お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public:  int m_int1;  Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){  /*ここの記述方法が分かりません*/  /*C1から呼び出されたらC1のm_int1に100を入れる*/  /*以下間違え*/  class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/  C2_1.m_int1 = 100; } void main(){  class1 C1;  C1.m_int1 = 10;  C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。

  • 配列であるメンバのコンストラクタを呼ぶ方法

    C++のクラスについて教えていただけないでしょうか。以下のような場合、 class ClassA {   int A; public:   ClassA(int a): A(a) {} }; class ClassB {   ClassA A; public:   ClassB(): A(10) {} }; class ClassC {   ClassA A[2]; public:   ClassC() {} //配列であるメンバのコンストラクタを呼び出したい }; ClassBがClassAのコンストラクタを呼ぶには上記のような方法で良いと思うのですが、ClassCのようにメンバが配列の場合、そのメンバのコンストラクタを呼ぶにはどのようにしたら良いのでしょうか。ご教授をお願いします。

  • C++でfriendクラスにしているのにprivateメンバにアクセスできない

    C++でメンバ変数をprivateにして、特定のクラスにだけ公開するようにクラスをfriend指定したのですがprivateメンバにアクセスできませんとエラーが吐かれてしまいます。 先行宣言したりもしてみたのですがどうしても使用できません。 何か心当たりのあるかた教えてください。 class A { friend class B; private: int a; }; class B { public: void test( A *a ) { a->a = 0; } }; コードは違いますがこんな感じのことをしたいのです。 /* コンソールで小さなプログラムでテストしてみると動くのにいざ実際のソースに組み込むと動かないという奇妙な状態です。よろしくお願いします。 */

  • 試作クラス使用C++プログラムが動かない原因

    試しに作成した以下のプログラムにビルドエラーが発生し,困っているので質問しました. コンパイラは,「BBB *b」などクラスポインタ変数の部分がエラーと指摘しているのですが(他にも数か所ありますが…),間違っている理由が分からず困ってます. ご回答,よろしくお願い致します. ----------------------------------- #include <iostream> using namespace std; class AAA { public: // コンストラクタ AAA(){ b = new BBB( this ); } // デストラクタ ~AAA(){ delete b; } // メンバ変数 BBB *b; int i; // メンバ関数 void displayB(){ b->displayA(); } }; class BBB { public: // コンストラクタ BBB( AAA *a ){ this->a = a; } // デストラクタ ~BBB(){} // メンバ変数 AAA *a; int j; // メンバ関数 void displayA(){ printf( "%d\n", a->i ); } }; int main() { // 変数の定義 AAA a; // 変数の初期化 a.i = 2; a.b->j = 5; // 出力 printf( "%d\n", a.i ); a.b->displayA(); return 0; } -----------------------------------

  • クラスの中にクラス

    お世話になります。 クラス1のメンバにクラス2を入れ、クラス1のコンストラクタでクラス2を操作しようとすると例外で落ちてしまいました。 しかしコンストラクタ内で別にクラス2をつくると落ちませんでした。 class Class1 {  Class2 cl2; ←クラス1のメンバにクラス2を入れる public:  Class1(); }; Class1::Class1() {  cl2.hoge(); ←落ちた  /*  ↓だと落ちなかった  Class2 _cl2;  _cl2.hoge();  */ } これは何故でしょうか? ちなみにクラスはstd::mapを使用し、hoge()はinsert_typeでした。

  • テンプレートクラスでのクラス変数

    テンプレートから生成したクラスごとにクラス変数を設けて、 かつ、クラス変数の初期化をいちいちやらなくてもよい という状況を作りたいと考えています。 そこでたとえば template <int N> class test { public: static int class_var() { static int class_var_ = N; return class_var_; } }; としたとき test<1>::class_var() と test<2>::class_var() はどのような値になるのでしょうか? VC++ではテンプレート全体で class_var_の値が同じになってしまうようのなのですが。。。 そもそも、こういうクラス変数自体を つくろうという考えが間違っているのでしょうか? どなたかご存知でしたらお教えください。

  • C++ メンバイニシャライザリストについて

    メンバイニシャライザリストのかっこの中に値を書くと、その値でメンバが初期化されるそうですが、かっこの中には、そのメンバのコンストラクタの引数以外も書くことができるのでしょうか? 例えば以下のようなクラスを考えます。 class Token_stream{ public:  Token_stream():full(false), buffer(0){}  ・・・ private:  bool full;  Token buffer; }; class Token{ public:  char kind;  double value;  Token(char ch):kind(ch), value(0){}  Token(char ch, double val):kind(ch), value(val){} }; クラスToken_streamのコンストラクタのメンバイニシャライザリストはfull(false), buffer(0)となっていますが、full(false)はfullの型がboolだから理解できます。ところがbuffer(0)という記述が理解できません。bufferの型はTokenです。Tokenオブジェクトを0で初期化できるのでしょうか?