10/05/20 10:16:24
もうちょっと整理して話してくれ
何をどうしたいのかをまず明確に汁
969:デフォルトの名無しさん
10/05/20 10:16:59
ソースとエラーメッセージを貼ればいいのに。
970:デフォルトの名無しさん
10/05/20 10:17:51
>>966
せめてB.hの宣言はどれが正解なのか教えてください。
971:デフォルトの名無しさん
10/05/20 10:22:16
A.h
class cA {
};
----
B.cpp
cA hogeB;
..... hogeB を使いまわしている
----
C.cpp
..... hogeB が使いたい
こういうことなら
B.h
#include "A.h"
extern cA hogeB;
----
C.cpp
#include "B.h"
972:デフォルトの名無しさん
10/05/20 10:35:08
>>971
ありがとうございます。そういうことです。ちなみにメインはBです
B.hでextern cA hogeB;したのですが
B.hで#include "A.h"をしたらエラーが200個ほど出ました
B.cppで#include "A.h"をすると3つでした。これは認識できない型cAがB.cppで使われている。ほげBが未定義のクラスcAでB.cppで使われているというような物でした。
ヘッダはB.hでなければならいのでしょうか?
973:デフォルトの名無しさん
10/05/20 10:41:22
B.cppで#include "A.h"
C.cppで#include "A.h"と#include "B.h"をしたらエラーが消えました。ありがとうございました
extern class ~という方法は知りませんでした。
974:デフォルトの名無しさん
10/05/20 11:07:56
>>973
とりあえず基本を理解しろ。
URLリンク(www.google.co.jp)
975:デフォルトの名無しさん
10/05/20 11:11:10
>>973
なんでエラーになってたのか理解できてるのか?
976:デフォルトの名無しさん
10/05/20 13:36:03
>>956
質問内容からすると、グローバルを使わない方は関数に値を渡すことになるだろうから、その分遅くなるよ
ただし、1秒間に60回程度の処理を想定しているなら、(数字に表れないぐらいの)誤差だろうね
毎回変数を作り直すってのがわからんけど、標準C/C++でのローカル変数の扱いはスタックに
2byteなり4byteなりの領域を確保するか、しないかの問題だから速度低下にはならないと思うよ
977:デフォルトの名無しさん
10/05/20 13:39:37
>>976
グローバルを関数引数にして遅くなるとも限らない。
結局は、実測しないと何も言えない。
978:デフォルトの名無しさん
10/05/20 14:33:04
>>977
もしかして喧嘩売ってる?
979:デフォルトの名無しさん
10/05/20 15:28:38
具体的なコードを出さないと答えようがないだろう。
staticやグローバル変数を使うと最適化が甘くなるリスクはあるな。
980:デフォルトの名無しさん
10/05/20 15:43:08
んなもん作ってから考えたらいいんじゃね
ってのはダメですか
981:デフォルトの名無しさん
10/05/20 16:20:56
只今C++の勉強中で
クラスの継承と一緒にメンバ関数のオーバーライドが出来るとあるのですが、
これを使う意味ってあるのでしょうか?
class ctest{
int m;
char *p;
public:
virtual int put(char *); //pに文字列を入れる関数
}
class stestSub : public ctest{
public:
int put(char *); //pに文字列を入れる関数(全て小文字に変換)
}
ctest s1;
s1.put("ABced");
stestSub s2;
s2.put("zxcVB");
以上のように定義してしまうと、s2からメインクラスのputを使う事が出来なくなるし、
別名でサブクラスに新たにput2()などで定義したほうがいいのではないでようか?
同じ名前で別の機能を持たせる意味が分からないのですが、どのような時に使用
するものなのでしょうか?
継承したプログラマがこの関数名はこの機能を持たせたいとか、そういったレベル
で同じ名前にしているのか?と思っているのですが。
982:デフォルトの名無しさん
10/05/20 16:22:35
s2.ctest::put()
983:デフォルトの名無しさん
10/05/20 17:06:37
>>981
ポリモーフィズムでググれ
984:デフォルトの名無しさん
10/05/20 17:56:48
クラス名をctestとしている内はこの問題は理解しにくいよね
クラス名で目的が決まってるからこそ、関数名が同じであることに意味がでてくる
985:デフォルトの名無しさん
10/05/20 19:58:30
いい言葉が出てこなかったのですが、その「クラスで目的が決まっている」って
部分が引っ掛かってた所でした。
このクラス名(目的)でこの関数はこの機能を持たせたいって意味で、名前は
同じだけど機能が違う物を定義してるってことでしょうか。
あとメインクラスの関数も呼ぶことができたのですね。
ありがとうございました。
986:デフォルトの名無しさん
10/05/20 20:21:30
クラス 基底クラス 仮想関数 結果
犬 鳴くことができる動物 鳴く わん
猫 鳴くことができる動物 鳴く にゃー
人 鳴くことができる動物 鳴く あんあん
たとえばこれらのクラスに対して三回鳴けという関数を作るとして
犬猫人それぞれにまったく同じコードを3回も書くのってだるいじゃん?
ところがC++はいい子だから鳴くことができる動物に対して三回鳴けって関数を作れば犬猫人どれでもそのコードが使えちゃうわけ
やったね!三倍コードが短くなったよ!
987:デフォルトの名無しさん
10/05/20 20:24:13
もっと実用的でありながらよく分かる例を出すべき
988:デフォルトの名無しさん
10/05/20 20:24:44
class Human : Cat
989:デフォルトの名無しさん
10/05/20 20:26:18
RPGのキャラとかいい例じゃないか
990:デフォルトの名無しさん
10/05/20 20:29:09
>>985
例えばクラス・GameLogicなんてのがあったとして、こいつはゲームの処理で主にプレイヤー以外の
なんらかの物体を移動など処理するクラスとした時、例えばステージや自分からみて敵となるプレイヤーキャラの
情報はどのタイプの敵でも必要な物だから同じように取得するが、それぞれの動きの内容は、それぞれ個別に定義したい。
しかし個別ではあるが、いずれも「攻撃しろ」と言えば攻撃して欲しい。
そんなかんじ
991:デフォルトの名無しさん
10/05/20 20:31:07
実際ジョブごとにクラス作ってんだろうか
992:デフォルトの名無しさん
10/05/20 20:56:53
class ToDO { virtual void doit() { printf("やったつもり"); };
class Ore1 : public ToDO { virtual void doit() { printf("明日になればやる"); };
class Ore2 : public ToDO { virtual void doit() { printf("やってるつもりだが何か?"); };
class Ore3 : public ToDO { virtual void doit() { printf("/(^o^)\"); };
Ore1 hoge;
Ore2 huga;
Ore3 hage;
ToDO* job_list[] = { &hoge, &hoge, &hoge, &hoge, &hage };
....
list[i]->doit();
993:デフォルトの名無しさん
10/05/20 21:15:10
>>985
機能が違うなら別の名前にするかな
一度日常にあるものでカテゴリー分けしてみるといいかもしれないね
親になるクラスを設計するときは、子になるクラスにおいて共通する機能を洗い出して実装するのだけど
>>986の例を借りれば
親:生物クラス ←生物とは鳴くものだ//関数の雛型だけ用意でもよい
子:犬クラス 一般的に「ワンワン」と鳴く
孫1:ヨークシャテリアクラス「バウバウ」と鳴く
孫2:柴犬クラス「アオーン」と鳴く
今回の例でいえば、子と孫の関係になるが
ヨークシャテリア(クラス)は鳴く(関数)→「バウバウ」
ヨークシャテリア(クラス)は(子:犬として)鳴く関数)→「ワンワン」
疑問に思っているように実装すると
ヨークシャテリア(クラス)は鳴く(関数)→「ワンワン」
ヨークシャテリア(クラス)はヨークシャテリアは鳴く(関数)→「バウバウ」
994:デフォルトの名無しさん
10/05/20 22:16:42
抽象化された命令をだして、実際の動作は各オブジェクトに任せる
つまり上司と下っ端の関係みたいなもんだよ
上司は何も知らなくてもやりたいことだけを言って
下っ端が必死こいて作業をこなしていく
995:デフォルトの名無しさん
10/05/20 22:55:25
例えばウィンドウを描くプログラムがあったとして、そのウィンドウに
いろいろな部品を簡単に追加できると便利だろう。
そこで、こんなクラスを作り、
class Item {
public:
Item();
virtual ~Item();
virtual void Draw();
...
};
class ListBox : public Window { public: virtual void Draw(){ リストボックスを描く } };
class Button : public Window { public: virtual void Draw(){ ボタンを描く } };
class Picture : public Window { public: virtual void Draw(){ 画像を描く } };
class Window {
public:
void AddItem(Item* pItem){ items.push_back(pItem); }
void Draw() {
for(int i = 0; i < items.size(); ++i){ items[i]->Draw(); }
}
private:
std::vector<Item*> items;
};
996:デフォルトの名無しさん
10/05/20 22:56:31
このように使う。
ListBox listBox;
Button yesButton, noButton;
Picture background;
Window window;
window.AddItem(&listBox);
window.AddItem(&yesButton);
window.AddItem(&noButton);
window.AddItem(&background);
window.Draw();
997:デフォルトの名無しさん
10/05/20 23:09:58
>>991
昔ならいざしらず、今は作ってるでしょう
998:デフォルトの名無しさん
10/05/21 07:16:08
++
999://
10/05/21 07:41:40
スレの住人喜べ
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
スレリンク(tech板)l1
1000:デフォルトの名無しさん
10/05/21 07:43:51
1000なら>>999乙
1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。