クラスのプロトタイプ宣言について質問があります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

クラスのプロトタイプ宣言について質問があります

#1

投稿記事 by taketoshi » 11年前

こんばんわ、お世話になります。

あるクラスのprivateメンバ、protectedメンバをほかのクラスで参照したいです。
参照するため、別クラスのポインタをメンバに持たせて
privateメンバにアクセスする方法を考えてみたのですが、クラス自体のプロトタイプ宣言について質問があります。

試しに以下のコードを書いてみましたが

コード:

1>c:\users\admin\desktop\aaa\aaa\aaa.cpp(22) : error C2512: 'foo' : クラス、構造体、共用体に既定のコンストラクタがありません。
1>c:\users\admin\desktop\aaa\aaa\aaa.cpp(23) : error C2027: 認識できない型 'foo' が使われています。
1>        c:\users\admin\desktop\aaa\aaa\aaa.cpp(7) : 'foo' の宣言を確認してください。
1>c:\users\admin\desktop\aaa\aaa\aaa.cpp(23) : error C2227: '->show' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
次のようなエラーが出ます。
冒頭でfooクラスのプロトタイプ宣言をしているのですが、コンストラクタ無いよといわれています。
fooクラスをhogeクラスの前にボトムアップすれば普通に動くので良いのですが、プロトタイプ宣言しているのになぜ動かないのか疑問です。

ボトムアップせずに動かす方法とかはあるのでしょうか?
宣言方法などありましたら教えてください。お願いいたします

コード:


#include "stdafx.h"

//クラスのプロトタイプ宣言
class foo;

typedef struct{
	int x,y;
}str;


class hoge{
private:
	str s;
	foo *f;//fooへの参照
public:
	hoge(){
		s.x = 10;
		s.y = 20;
		f = new foo();//fooのインスタンス化
		f->show(&s);//fooにhogeのプライベートメンバの参照を渡してfooクラスでprintfする
	}
};

//fooクラスを宣言
class foo{
public:
	void show(str *);
	foo();
	~foo();
};

//コンストラクタ
foo::foo(){
}

//デストラクタ
foo::~foo(){
}


void foo::show(str *s){
	//fooクラスからhogeクラスのprivateメンバにアクセス
	printf("fooからアクセスしたhogeクラスのstr = s %d\n",s->x);
}

//main関数
int _tmain(int argc, _TCHAR* argv[])
{

	hoge *hg = new hoge();

	return 0;
}



ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: クラスのプロトタイプ宣言について質問があります

#2

投稿記事 by ISLe » 11年前

プロトタイプではなくて不完全型宣言ですね。

不完全型宣言した識別子は型名として使用できますが、コンストラクタ含めメンバにアクセスすることはできません。

アバター
せんちゃ
記事: 50
登録日時: 13年前
住所: 江別市東野幌町
連絡を取る:

Re: クラスのプロトタイプ宣言について質問があります

#3

投稿記事 by せんちゃ » 11年前

そのような方法をとりたい場合はヘッダーに分けるといいと思います。

コード:

// hoge.h
class foo;
 
typedef struct{
    int x,y;
}str;
 
 
class hoge{
private:
    str s;
    foo *f;//fooへの参照
public:
    hoge();
};

コード:

#include "foo.h"
// hoge.cpp
hoge::hoge(){
        s.x = 10;
        s.y = 20;
        f = new foo();//fooのインスタンス化
        f->show(&s);//fooにhogeのプライベートメンバの参照を渡してfooクラスでprintfする
}

コード:

// foo.h
//fooクラスを宣言
class foo{
public:
    void show(str *);
    foo();
    ~foo();
};
 

コード:

// foo.cpp
//コンストラクタ
foo::foo(){
}
 
//デストラクタ
foo::~foo(){
}
 
 
void foo::show(str *s){
    //fooクラスからhogeクラスのprivateメンバにアクセス
    printf("fooからアクセスしたhogeクラスのstr = s %d\n",s->x);
}
ヽ(*゚д゚)ノ カイバー

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: クラスのプロトタイプ宣言について質問があります

#4

投稿記事 by taketoshi » 11年前

>>ISLeさん

プロトタイプ宣言じゃなかったんですね。
不完全型宣言とは初めて知りました。ググったところどのようなものか理解できました。
そのうちこんなクラスが出てくるよーってコンパイラに教えてるみたいですね。

>>せんちゃさん
普段こういった書き方をしているので、今回一つのcppに書いたときこのエラーが出たのが不思議でした。
今後はヘッダーで分けていけば問題はなさそうです。

お二方ありがとうございました。
解決といたします。

閉鎖

“C言語何でも質問掲示板” へ戻る